Botón InputToolbar Send no funciona

Estoy trabajando con JSQMessagesViewController y Firebase para implementar una function de chat en mi aplicación. Tuve todo funcionando bien en mi ChatViewController. Pero ahora he movido mi ChatViewController a una vista de contenedor que está dentro de un controller de vista principal y ahora el button "enviar" no funciona cuando se amplía el keyboard.

En otras palabras, para enviar un post de chat, debo llamar a view.endEditing(true) en el controller de vista padre que está dentro de un UITabBarController, y luego el button enviar funcionará. Pero mientras el keyboard esté expandido, el button enviar no responde. debajo está mi código ChatViewController …

 import Foundation import UIKit import FirebaseDatabase import JSQMessagesViewController final class ChatViewController: JSQMessagesViewController { var outgoingBubbleImageView: JSQMessagesBubbleImage! var incomingBubbleImageView: JSQMessagesBubbleImage! var fireRootRef: FIRDatabaseReference! var chatMessages = [JSQMessage]() var messagesRefHandle: UInt! var chatChannelId: String! override func viewDidLoad(){ super.viewDidLoad() self.inputToolbar.contentView.textView.backgroundColor = UIColor.clear inputToolbar.alpha = 0.7 ... } override func viewWillAppear(_ animated: Bool){ super.viewWillAppear(animated) } override func viewDidAppear(_ animated: Bool){ super.viewDidAppear(animated) } func setupView(){ ... } override func viewWillDisappear(_ animated: Bool) { super.viewDidDisappear(animated) removeChatObserver() } func removeChatObserver(){ ... } private func setupMessageBubbles() { ... } override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return chatMessages.count } override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! { let message = chatMessages[indexPath.item] if message.senderId == senderId { return outgoingBubbleImageView } else { return incomingBubbleImageView } } override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = super.collectionView(collectionView, cellForItemAt: indexPath) as! JSQMessagesCollectionViewCell let message = chatMessages[indexPath.item] if message.senderId == senderId { cell.textView!.textColor = UIColor.white } else { cell.textView!.textColor = UIColor.black } return cell } override func collectionView(_ collectionView: JSQMessagesCollectionView!, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout!, heightForMessageBubbleTopLabelAt indexPath: IndexPath!) -> CGFloat { let message = chatMessages[indexPath.item] if message.senderId == self.senderId { return 0 } if indexPath.item > 0 { let previousMessage = chatMessages[indexPath.item - 1] if previousMessage.senderId == message.senderId { return 0 } } return kJSQMessagesCollectionViewCellLabelHeightDefault } override func collectionView(_ collectionView: JSQMessagesCollectionView!, attributedTextForMessageBubbleTopLabelAt indexPath: IndexPath!) -> NSAttributedString! { let message = chatMessages[indexPath.item] switch message.senderId { case senderId: return nil default: guard let senderDisplayName = message.senderDisplayName else { assertionFailure() return nil } return NSAttributedString(string: senderDisplayName) } } //no avatar images override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! { return nil } override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) { print("DID PRESS SEND") let fireMessagesRef = fireRootRef.child("messages").child(chatChannelId) let itemRef = fireMessagesRef.childByAutoId() let messageItem = [ "text": text, K.MessageKeys.senderIdKey: senderId, "displayName": senderDisplayName, ] itemRef.setValue(messageItem) JSQSystemSoundPlayer.jsq_playMessageSentSound() finishSendingMessage() } override func didPressAccessoryButton(_ sender: UIButton!) { // } private func observeMessages() { ... } func addMessage(id: String, text: String, name: String) { ... } } 

Me gustaría arreglar el button de envío para que el usuario pueda presionar enviar cuando el keyboard esté expandido. Es interesante que para descartar el keyboard tenga que llamar a view.endEditing(true) en el controller de vista principal y no en la vista secundaria. Esto me hizo pensar que necesito configurar la acción del button en la vista principal, pero no he tenido ningún éxito. Gracias por tu ayuda

Lo que supongo que es la vista de colección jsq cubre la vista de input, por lo que está presionando la vista de colección, no el button de enviar. Coloque un punto de interrupción en - (void)jsq_didReceiveKeyboardWillChangeFrameNotification:(NSNotification *)notification en JSQMessagesViewController , compruebe si CGRectGetHeight(keyboardEndFrame) e insets.bottom para configurar la vista de recostackción inferior son espacios suficientes para mostrar la vista de input en su contenedor. Un problema es que el controller jsq usa la reproducción automática para ajustar las subvistas, la vista de colección está alineada con su topLayoutGuide y la bottomLayoutGuide que es la cosa del controller de vista, cuando coloca un controller de vista dentro de otro controller de vista, lo que puede causar confusión.

Tome iPhone 6 (s) / 7 más, por ejemplo, la altura del keyboard es 271, la barra de input es 44 en el controller, por lo que la altura total es 315. Por CGRectGetHeight(keyboardEndFrame) + insets.bottom tanto, CGRectGetHeight(keyboardEndFrame) + insets.bottom debería ser 315. Ponga un punto de interrupción en esa línea, comtesting si la sum es 315, si no, eso significa algo calculado mal.

Actualización para la solución Si la causa se menciona anteriormente, intente esto para resolver el problema

 self.additionalContentInset = UIEdgeInsets(top: 0, left: 0, bottom: 44, right: 0) 

Esto agregará un recuadro inferior a la vista de colección. Agregue esto después de viewDidLoad