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)
}
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.