2

我正在使用FirebaseJSQMessagesViewcontroller。我添加了一些消息來測試,但沒有顯示。任何人都可以幫忙看看我錯過了什麼嗎?謝謝!JSQMessagesViewController和Firebase

enter image description here

我的代碼:

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()))! 
} 

} 
+0

我覺得你忘了通知新的,添加的消息的收集視圖,但我不會賭它。 – vzsg

+0

嗨弗蘭克,我添加finishReceivingMessage()後,應用程序崩潰。 – developermike

回答

2

因此,對於初學者,我建議你去結賬JSQMessagesVeiwControllerDevelop分支,並拉起包含在其中的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。您在發件人ID的正確路徑中,只需確保已爲登錄的用戶獲取唯一的ID,然後確保該用戶發送的郵件具有相同的ID。

祝你好運

0

你必須將所有的示例消息的後面添加finishReceivingMessage()。這有點像tableView.reloadData(),除了JSQMessagesViewController。它也滾動到您的最新消息。

+0

謝謝,但我確實嘗試過。我添加了finishReceivingMessage()後,項目崩潰了。 – developermike

+0

嗯,這很奇怪...你肯定需要finishReceivingMessage(),所以必須有一些其他問題......你能否將錯誤消息添加到你的答案? – Jacolack

+0

謝謝。抱歉,我現在無法訪問該項目。明天將提供所有信息。 – developermike

相關問題