2017-01-29 2 views
1

Ich habe eine Nachrichtenansichtssteuerung, die über eine InputAccessoryView verfügt. Das Problem, das ich habe, ist, wenn ich (Benutzerdaten) an den Nachrichtencontroller von meinem ersten Ansichtscontroller übergebe, der InputAccessoryView nicht anzeigt. Wenn ich nun die (Benutzerdaten) vom Message List Controller an den Message Controller übergebe, wird die InputAccessoryView angezeigt.InputAccessoryView Wird nicht angezeigt - Swift 3 Xcode 8.3 beta (Nicht storyBoard)

Hier ist die Botschaft Controller:

class MessageViewController: UICollectionViewController, UITextFieldDelegate, UICollectionViewDelegateFlowLayout, UIImagePickerControllerDelegate, UINavigationControllerDelegate {  
var user: User? { 
    didSet { 
     navigationItem.title = user?.first_name 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    collectionView?.keyboardDismissMode = .interactive 
    setupKeyboardObservers() 
} 

lazy var inputContainerView: ChatInputContainerView = { 
    let chatInputContainerView = ChatInputContainerView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 50)) 
    chatInputContainerView.newMessageViewController = self 
    return chatInputContainerView 
}() 

override var inputAccessoryView: UIView? { 
    get { 
     return inputContainerView 
    } 
} 

override var canBecomeFirstResponder : Bool { 
    return true 
} 

func setupKeyboardObservers() { 
    NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardDidShow), name: NSNotification.Name.UIKeyboardDidShow, object: nil) 
} 

func handleKeyboardDidShow() { 
    if messages.count > 0 { 
     let indexPath = IndexPath(item: messages.count - 1, section: 0) 
     collectionView?.scrollToItem(at: indexPath, at: .top, animated: true) 
    } 
} 

override func viewDidDisappear(_ animated: Bool) { 
    super.viewDidDisappear(animated) 
    NotificationCenter.default.removeObserver(self) 
} 
} 

Und die Nachrichtenliste Controller:

class MessageViewController: UITableViewController { 
    let user = User() 
    let newMessageViewController = NewMessageViewController(collectionViewLayout: UICollectionViewFlowLayout()) 
    //Send user data to (newMessageViewController) and show newMessageViewController view controller 
    newMessageViewController.user = user 
    newMessageViewController.hidesBottomBarWhenPushed = true   
    self.navigationController?.pushViewController(MessageViewController, animated: true) 
} 

Nun, dies funktioniert gut! Hier beginnt das Problem. Der erste View-Controller hat eine Unteransicht, die (Benutzerdaten) über Delagate an die Superview sendet.

delegate?.sendBackToDrag(passBackFromBlur: user) 

Dann präsentiert die sendBackToDrag-Methode blurPopOver View-Controller.

func sendBackToDrag(passBackFromBlur: User) { 
    let blurPopOver = BlurPopOver() 
    blurPopOver.user = passBackFromBlur as User 
    blurPopOver.delegate = self 
    blurPopOver.modalPresentationStyle = .overFullScreen 
    present(blurPopOver, animated: false, completion: nil) 
} 

Nachdem der blurPopOver angezeigt wurde, sendet er (Benutzerdaten) zurück zum ersten View-Controller.

delegate?.sendBackToFind(passBackToFind: user) 

Wenn Daten über Delegate zurückgegeben werden, Anzeige der Nachrichtenansicht Controller.

func sendBackToFind(passBackToFind: User) { 
    let newMessageViewController = NewMessageViewController(collectionViewLayout: UICollectionViewFlowLayout()) 
    newMessageViewController.user = passBackToFind 
    newMessageViewController.hidesBottomBarWhenPushed = true 
    self.navigationController?.pushViewController(MessageViewController, animated: true) 
} 

Hier sind die Protokolle:

protocol MessageDelegateDrag { 
    func sendBackToDrag(passBackFromBlur: User) 
} 

protocol MessageDelegateFind { 
    func sendBackToFind(passBackToFind: User) 
} 

enter image description here

Nun, es funktioniert, wenn ich übergeben Sie die (Nutzdaten) in etwa so aus:

func sendBackToFind(passBackToFind: User) { 
    let user = User() 
    user.id = "user_id" 
    user.first_name = "user_first_name" 
    user.last_name = "user_last_name" 
    user.profile_image = "user_image_url" 

    let newMessageViewController = NewMessageViewController(collectionViewLayout: UICollectionViewFlowLayout()) 
    newMessageViewController.user = user 
    newMessageViewController.hidesBottomBarWhenPushed = true 
    self.navigationController?.pushViewController(MessageViewController, animated: true) 
} 

Es scheint Das Hinzufügen der Daten als Konstante in der sendBackToFind-Methode funktioniert einwandfrei.

Antwort

0

Ich fand eine Lösung. Ich habe schließlich eine Unteransicht zum 1. Ansicht-Controller hinzugefügt und den Nachrichten-Controller aus der Unteransicht gedrückt. Entfernen Sie den Popover-Controller vollständig. Ich bin mir nicht sicher, ob dies die beste Lösung ist, aber es funktioniert!

Verwandte Themen