【问题标题】:Navigation Bar is Hidden in JSQMessagesViewController导航栏隐藏在 JSQMessagesViewController 中
【发布时间】:2018-02-25 10:15:19
【问题描述】:

我正在努力在我的应用程序中加入聊天功能,使用 JSQMessagesViewController 一切正常,只是我无法在视图控制器中显示导航栏。我已经尝试了几乎所有看起来的东西,但它似乎被视图或其他东西隐藏了,尽管我不确定这一点。这是我的对话视图控制器代码:

import UIKit
import JSQMessagesViewController
import Firebase
import AVKit

class ConvoVC: JSQMessagesViewController {

var chatRoomId = Variables.chatRoomID
var outgoingBubbleImageView: JSQMessagesBubbleImage!
var incomingBubbleImageView: JSQMessagesBubbleImage!
var messages = [JSQMessage]()

override func viewDidLoad() {
    super.viewDidLoad()

    senderId = uid!
    senderDisplayName = uid!

    let factory = JSQMessagesBubbleImageFactory()

    incomingBubbleImageView = factory?.incomingMessagesBubbleImage(with: UIColor.jsq_messageBubbleLightGray())
    outgoingBubbleImageView = factory?.outgoingMessagesBubbleImage(with: UIColor.jsq_messageBubbleBlue())

    collectionView.collectionViewLayout.incomingAvatarViewSize = CGSize.zero
    collectionView.collectionViewLayout.outgoingAvatarViewSize = CGSize.zero

    let query =  ref.child("ChatRooms").child(chatRoomId!).child("Messages").queryLimited(toLast: 10)

    query.observe(.childAdded, with: { (snapshot) in
        if snapshot.exists(){
        if  let data        = snapshot.value as? [String: String],
            let id          = data["sender_id"],
            let name        = data["name"],
            let text        = data["text"],
            !text.isEmpty
        {
            if let message = JSQMessage(senderId: id, displayName: name, text: text)
            {
                self.messages.append(message)

                self.finishReceivingMessage()
            }
        }
    }
    })

    //let navigationBar = UINavigationBar(frame: CGRect(0, 0, self.view.frame.size.width, 64)) // Offset by 20 pixels vertically to take the status bar into account

    //navigationBar.backgroundColor = UIColor.white
    //navigationBar.delegate = self as! UINavigationBarDelegate

    // Create a navigation item with a title
    //let navigationItem = UINavigationItem()
    //navigationItem.title = contacts[i].firstName

    // Create right button for navigation item
    setupBackButton()

    // Make the navigation bar a subview of the current view controller
    //self.view.addSubview(navigationBar)

}


override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(true)
    self.navigationController?.isNavigationBarHidden = false
}
func setupBackButton() {
    let backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(backButtonTapped))
    navigationItem.leftBarButtonItem = backButton
}
@objc func backButtonTapped() {
    dismiss(animated: true, completion: nil)
}



override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
    let cell = super.collectionView(collectionView, cellForItemAt: indexPath) as! JSQMessagesCollectionViewCell

    let message = messages[indexPath.item]

    if message.senderId == senderId {
        cell.textView!.textColor = UIColor.white
    } else {
        cell.textView!.textColor = UIColor.black
    }

    return cell
}

override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAt indexPath: IndexPath!) -> JSQMessageData! {
    return messages[indexPath.item]
}


override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return messages.count

}



override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) {
    let messageRef = ref.child("ChatRooms").child(chatRoomId!).child("Messages").childByAutoId()


    let message = ["sender_id": senderId, "name": senderDisplayName, "text": text]

    messageRef.setValue(message)

    finishSendingMessage()
    JSQSystemSoundPlayer.jsq_playMessageSentSound()
    self.finishSendingMessage()

}

override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! {
    let message = messages[indexPath.item]
    if message.senderId == senderId {
        return outgoingBubbleImageView
    }else {
        return incomingBubbleImageView
    }
}




}

下面是对话视图控制器之前的类中 didSelectRow 方法的代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let chatFunctions = ChatFunctions()

    ref.child("users").child(uid!).observeSingleEvent(of: .value) { (snapshot) in
        let userOne = User(snapshot: snapshot)
        self.chatRoomIdentity = chatFunctions.startChat(user1: userOne , user2: self.matches[indexPath.row])
        self.senderDisName = self.matches[indexPath.row].firstName
        Variables.chatRoomID = self.chatRoomIdentity

        self.present(ConvoVC(), animated: true, completion: nil)

    }




}

提前致谢!

【问题讨论】:

    标签: swift firebase uinavigationcontroller uinavigationbar jsqmessagesviewcontroller


    【解决方案1】:

    您在这一行以模态方式呈现它,这将全屏呈现(所以没有导航栏):

    self.present(ConvoVC(), animated: true, completion: nil)
    

    像这样将其推送到导航堆栈上:

    self.navigationController?.pushViewController(ConvoVC(), animated: true)
    

    如果您没有将第一个控制器设置为导航控制器的根视图控制器,请务必事先设置。

    或者将 ConvoVC 设置为导航控制器的根视图控制器并呈现该导航控制器

    self.present(navigationController, animated: true, completion: nil).
    

    第一个解决方案将让您弹出 ConvoVC 并通过导航栏返回到前一个视图控制器,而后者不会(您必须关闭它)。

    我强烈建议阅读 iOS 导航和转场,因为它是任何 iOS 应用程序的核心方面。

    【讨论】:

    • 非常感谢!我刚开始学习 Swift,所以还有很多我不完全理解的地方。现在一切正常,但是当我按下后退导航按钮时调用dismiss时,它不起作用。我猜这是因为我正在推动视图控制器而不是仅仅呈现它。对于这种情况,解雇的替代方法是什么?
    • 如果你正在推动视图控制器,后面的动作就是弹出它。 Push/pop & present/dismiss 是那些导航对。尝试通过调用 navigationController?.popViewController(animated: true) 来弹出视图控制器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多