Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios InputToolbar发送按钮不工作_Ios_Swift_Jsqmessagesviewcontroller - Fatal编程技术网

Ios InputToolbar发送按钮不工作

Ios InputToolbar发送按钮不工作,ios,swift,jsqmessagesviewcontroller,Ios,Swift,Jsqmessagesviewcontroller,我正在与JSQMessagesViewController和Firebase合作,在我的应用程序中实现聊天功能。我的ChatViewController运行良好。但是现在我已经将ChatViewController移动到父视图控制器中的容器视图中,现在当键盘展开时,“发送”按钮不起作用 换句话说,为了发送聊天信息,我必须在UITabBarController中的父视图控制器上调用view.endEditing(true),然后发送按钮将工作。但只要键盘展开,发送按钮就不会响应。下面是我的Chat

我正在与JSQMessagesViewController和Firebase合作,在我的应用程序中实现聊天功能。我的ChatViewController运行良好。但是现在我已经将ChatViewController移动到父视图控制器中的容器视图中,现在当键盘展开时,“发送”按钮不起作用

换句话说,为了发送聊天信息,我必须在UITabBarController中的父视图控制器上调用
view.endEditing(true)
,然后发送按钮将工作。但只要键盘展开,发送按钮就不会响应。下面是我的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)
。这让我觉得我需要在父视图上配置按钮操作,但是我没有成功。感谢您的帮助

我猜jsq集合视图会覆盖输入视图,因此您按下的是集合视图,而不是发送按钮。在
JSQMessagesViewController
中的
-(void)jsq\u didReceiveKeyboardWillChangeFrameNotification:(NSNotification*)通知上放置断点,检查
CGRectGetHeight(keyboardEndFrame)是否
insets.bottom
用于设置集合视图底部有足够的空间显示容器中的输入视图。一个问题是,jsq控制器使用autolayout来调整子视图,集合视图与视图控制器的
topLayoutGuide
bottomLayoutGuide
对齐,当您将视图控制器放在另一个视图控制器中时,可能会导致混淆

以iPhone 6(s)/7 plus为例,控制器中的输入工具栏高度为271,因此总高度为315。因此,CGRectGetHeight(keyboardEndFrame)+插入。底部应为315。在该行上放置一个断点,检查总和是否为315,如果不是,则表示计算错误

解决方案更新 如果上面确实提到了原因,请尝试使用此方法解决问题

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

这将向集合视图添加底部插图。在视图加载后添加此选项

视图可见但不交互的常见原因是它超出了其父视图的范围。视图仍然会在其父对象的边界之外绘制,但它们无法接收接触。我会将按钮的框架与层次结构中其上方视图的边界进行比较。感谢Dave的输入,但这似乎不是问题所在,我的容器视图的边界在其父视图的边界内。我所指的按钮是iOS键盘的一部分,它不是我自己添加/配置的按钮是没有响应的按钮吗?或者它会对你的触摸做出反应,但不会导致任何事情发生?当键盘展开时,它没有反应。我能分辨出来,因为按钮文本的颜色在触摸时不会改变。当键盘折叠时,按钮文本将从浅蓝色变为深蓝色(当手指放在键盘上时),然后在释放时变回浅蓝色。但这种颜色变化在键盘展开时不会发生,因此按钮似乎完全没有响应/禁用。我不确定可能是什么问题。如果您可以分享您的项目或复制该问题的示例,我很乐意深入了解。您能否在Swift中添加一个示例,说明如何检查
cRectGetHeight(keyboardEndFrame)
insets。对于设置集合视图,底部有足够的空间在容器中显示输入视图?我有困难。好的,我使用了一个断点,但是我找不到
insets.bottom
的值。我只能看到输入工具栏
\u preferredDefaultHeight=44
。即使你是对的,并且计算出了一些错误,那么我实际上如何着手修复它呢?这取决于你如何将
inputToolBar
移动到容器视图控制器,如果没有布局代码,我也帮不了你。您需要向我展示如何使用容器包装聊天视图控制器。聊天视图控制器通过故事板嵌入到容器视图中。我将一个IBOutlet连接到父视图控制器,以便隐藏/取消隐藏聊天视图。我可以从父控制器调用聊天视图控制器中的函数,方法是访问其子视图控制器,如
let chatVC=self.childViewControllers[0]as!ChatVC
。输入工具栏是JSQMessagesViewController的一部分,我不必为此编写任何自定义代码,我确信键盘响应到容器视图控制器,而不是聊天视图控制器,并且容器没有工具栏,因此键盘高度仅为271,然后您的聊天视图控制器使用此值调整集合视图插入,它将覆盖inputToolbar。这就是为什么它不能被触摸的原因,您可以尝试添加一个不可见/透明的工具栏,禁用用户交互,以查看它是否工作,否则,如果您坚持将其放入容器中,请更改
jsqMessageViewController
中的插入代码。