我正在使用Firebase和JSQMessagesViewcontroller。我添加了一些消息来测试,但是没有出现。有人能帮我看看我错过了什么吗?谢谢!

我的守则:
import UIKit
import Firebase
import JSQMessagesViewController
class ChatViewController: JSQMessagesViewController {
var messages = [JSQMessage]()
lazy var outgoingBubbleImageView:JSQMessagesBubbleImage = self.setupOutgoingBubble()
lazy var incomingBubbleimageView:JSQMessagesBubbleImage = self.setupIncomingBubble()
override func viewDidLoad() {
super.viewDidLoad()
self.senderDisplayName = "cindy"
self.senderId = FIRAuth.auth()?.currentUser?.uid
print("sender id is: \(self.senderId)")
}
override func viewDidAppear(_ animated: Bool) {
addMessage(withId: "john", name: "doo", text: "hello, I am here")
addMessage(withId: senderId, name: "Me", text: "how are you")
addMessage(withId: senderId, name: "Me", text: "i am earlier than you.")
// I added finishReceivingMessage() here, but the app crashed.
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return messages.count
}
override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAt indexPath: IndexPath!) -> JSQMessageData! {
return messages[indexPath.item]
}
override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! {
let message = messages[indexPath.item]
if message.senderId == senderId {
return outgoingBubbleImageView
} else {
return incomingBubbleimageView
}
}
func addMessage(withId id:String, name: String, text:String) {
if let message = JSQMessage(senderId: id, displayName: name, text: text) {
self.messages.append(message)
}
}
func setupOutgoingBubble() -> JSQMessagesBubbleImage {
let bubbleImagesFactory = JSQMessagesBubbleImageFactory()
return (bubbleImagesFactory?.outgoingMessagesBubbleImage(with: UIColor.jsq_messageBubbleBlue()))!
}
func setupIncomingBubble() -> JSQMessagesBubbleImage {
let bubbleImagesFactory = JSQMessagesBubbleImageFactory()
return (bubbleImagesFactory?.incomingMessagesBubbleImage(with: UIColor.jsq_messageBubbleLightGray()))!
}
}发布于 2016-11-17 21:06:06
因此,首先,我建议您检查一下Develop分支的JSQMessagesVeiwController,并提取包含在其中的SwiftExample。这是最新版本,已经为swift3进行了更新。那我就把你的问题隔离开来。由于您实际上是在本地生成消息,而不是利用firebase,所以我会将其注释掉。
然后我们就可以像他们在DemoConversation.swift文件中做的那样让你的假对话
let message = JSQMessage(senderId: "john", displayName: "doo", text: "hello, I am here")
let message2 = JSQMessage(senderId: "asdf", displayName: "Me", text: "how are you")
let message3 = JSQMessage(senderId: "asdf", displayName: "Me", text: "i am earlier than you.")
func makeNormalConversation() -> [JSQMessage] {
conversation = [message, message2, message3]
return conversation
}然后,您只需要确保所有设置都可以查看,并将消息设置为makeNormalConversation()。
然后,对于您的ChatViewController,最低代码量如下:
//
// ChatViewController.swift
// SwiftExample
//
// Created by Dan Leonard on 5/11/16.
// Copyright © 2016 MacMeDan. All rights reserved.
//
import UIKit
import JSQMessagesViewController
class ChatViewController: JSQMessagesViewController {
var messages = [JSQMessage]()
let defaults = UserDefaults.standard
var conversation: Conversation = makeConversation() // Here is where your messages are added.
var incomingBubble: JSQMessagesBubbleImage!
var outgoingBubble: JSQMessagesBubbleImage!
fileprivate var displayName: String!
override func viewDidLoad() {
super.viewDidLoad()
incomingBubble = JSQMessagesBubbleImageFactory().incomingMessagesBubbleImage(with: UIColor.jsq_messageBubbleBlue())
outgoingBubble = JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImage(with: UIColor.lightGray)
collectionView?.collectionViewLayout.incomingAvatarViewSize = .zero
collectionView?.collectionViewLayout.outgoingAvatarViewSize = .zero
automaticallyScrollsToMostRecentMessage = true
self.collectionView?.reloadData()
self.collectionView?.layoutIfNeeded()
}
// MARK: JSQMessagesViewController method overrides
override func didPressSend(_ button: UIButton, withMessageText text: String, senderId: String, senderDisplayName: String, date: Date) {
let message = JSQMessage(senderId: senderId, senderDisplayName: senderDisplayName, date: date, text: text)
self.messages.append(message)
self.finishSendingMessage(animated: true)
}
// MARK: JSQMessages CollectionView DataSource
override func senderId() -> String {
return "Cindy"
}
override func senderDisplayName() -> String {
return "Cindy Lue"
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return messages.count
}
override func collectionView(_ collectionView: JSQMessagesCollectionView, messageDataForItemAt indexPath: IndexPath) -> JSQMessageData {
return messages[indexPath.item]
}
override func collectionView(_ collectionView: JSQMessagesCollectionView, messageBubbleImageDataForItemAt indexPath: IndexPath) -> JSQMessageBubbleImageDataSource {
return messages[indexPath.item].senderId == self.senderId() ? outgoingBubble : incomingBubble
}
}查看开发分支的示例项目,了解更多细节,并让我知道您是否有更多的问题?
然后从现在开始,您应该添加Firebase。您在senderID的正确路径上,只需确保您确实为已登录的用户获得一个唯一的id,然后确保该用户发送的消息的ID是相同的。
祝好运
发布于 2016-11-16 00:19:55
必须在添加所有示例消息之后添加finishReceivingMessage()。这有点像一个tableView.reloadData(),除了JSQMessagesViewController。它还滚动到最新的信息,为您。
https://stackoverflow.com/questions/40619720
复制相似问题