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

こんにちはFrank、finishReceivingMessage()を追加した後、アプリがクラッシュしました。 – developermike

答えて

2

まず、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が同じであることを確認するだけです。

幸運

0

あなたは例のメッセージのすべてを追加した後finishReceivingMessage()を追加する必要があります。これは、JSQMessagesViewControllerを除いて、tableView.reloadData()のようなものです。また、最新のメッセージにスクロールします。

+0

ありがとう、しかし私は試してみました。 finishReceivingMessage()を追加した後、プロジェクトがクラッシュしました。 – developermike

+0

うーん、それは変だ...あなたは間違いなくfinishReceivingMessage()が必要なので、他の問題があるはずです...答えにエラーメッセージを追加できますか? – Jacolack

+0

ありがとうございます。申し訳ありませんが、現在プロジェクトにアクセスできません。明日すべての情報を載せます。 – developermike

関連する問題