2017-01-31 8 views
5

JSQMessagesViewControllerとFirebaseを使って、私のアプリケーションにチャット機能を実装しています。私はChatViewControllerでうまく動作していました。しかし、今私は親ビューコントローラ内にあるコンテナビューに私のChatViewControllerを移動し、キーボードが展開されたときに "送信"ボタンが動作しなくなりました。InputToolbar Sendボタンが機能しない

つまり、チャットメッセージを送信するには、自分自身がUITabBarController内にある親ビューコントローラでと呼ぶ必要があります。その後、送信ボタンが機能します。しかし、キーボードが拡張されている限り、送信ボタンは反応しません。以下は私の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) { 
     ... 
    } 


} 

私は、キーボードが展開されたときに送信をタップできるように送信ボタンを修正したいと思います。興味深いのは、キーボードを無効にするために、親ビューコントローラでview.endEditing(true)を呼び出す必要があり、子ビュー自体ではないということです。これは、親ビューでボタンアクションを設定する必要があると私には思っていましたが、私は成功しませんでした。あなたの助けをありがとう

+0

ビューが表示されてもインタラクティブでない一般的な原因は、ビューが親ビューの境界の外にあるということです。ビューはまだ親の境界の外に描画されますが、タッチを受け取ることはできません。私はボタンのフレームを階層の上のビューの境界と比較します。 –

+0

入力Daveのおかげで問題はないようですが、私のコンテナビューの境界は親ビューの境界内にあります。私が参照しているボタンは、iOSキーボードの一部です。自分で追加/設定したボタンではありません。 – MikeG

+0

ボタンが反応しませんか?それともあなたのタッチに反応しますが、何も起こらないでしょうか? –

答えて

0

jsqコレクションビューは入力ビューをカバーしているので、送信ボタンではなくコレクションビューを押しています。 - (void)jsq_didReceiveKeyboardWillChangeFrameNotification:(NSNotification *)notificationのブレークポイントをJSQMessagesViewControllerに設定し、コレクションビューの下に設定するCGRectGetHeight(keyboardEndFrame)insets.bottomがコンテナに入力ビューを表示するのに十分なスペースであることを確認します。問題は、jsqコントローラがautolayoutを使用してサブビューを調整することです。コレクションビューは、ビューコントローラを別のビューコントローラに配置したときに、そのビューコントローラの内容であるtopLayoutGuidebottomLayoutGuideに揃えられています。

iPhone 6(s)/ 7を入力すると、keyboard heightは271、コントローラの入力ツールバーの高さは44なので、合計高さは315です。したがって、CGRectGetHeight(keyboardEndFrame) + insets.bottomは315にする必要があります。合計が315であるかどうかは、何かが間違って計算されたことを意味します。ソリューション ため

アップデート原因は確かに上記されている場合は、これはコレクションビューにはめ込ま下に追加されます

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

問題を解決するために、これを試してみてください。これを後で追加するviewDidLoad

+0

はあなたがCGRectGetHeight(keyboardEndFrame) '天気を確認する方法のスウィフトの例を追加することができますあなたの助けのおかげ'となります'コレクションビューの下を設定するためのinsets.bottom'は?私は難しさを持っていた容器で入力ビューを表示するのに十分なスペースです。 – MikeG

+0

私の編集をチェック@MikeG。 – Terence

+0

[OK]を、私はブレークポイントを使用しているが、私は'の値を見つけることができないのです私が見ることができるのは、入力ツールバー '_preferredDefaultHeight = 44'です。あなたが正しく、何かが間違って計算されていても、どうすればそれを修正するのですか? – MikeG

関連する問題