@youtaijiao530

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

[swift, firebase]documentChangesの中がOptional

documentChangesの中がOptional

swiftでfirebaseを使用してChatアプリをつくっています。
しかしメッセージをリアルタイムで表示する機能を実装したのですが
documentChangeの中に何も入ってなく、メッセージ情報を表示することができません。
解決方法を教えていただけると幸いです。

発生している問題

import UIKit
import Firebase
import FirebaseFirestore

class ChatRoomViewController: UIViewController{

    var chatroom: ChatRoom?
    var user: User?
  

    private let cellId = "cellId"
    private var messages = [Message]()


    private lazy var chatInputAccessoryView: ChatInputAccessoryView = {
        let view = ChatInputAccessoryView()
        view.frame = .init(x: 0, y: 0, width: view.frame.width, height: 100)
        view.delegate = self
        return view
    }()


    @IBOutlet weak var ChatRoomTableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()

        ChatRoomTableView.delegate = self
        ChatRoomTableView.dataSource = self
        ChatRoomTableView.register(UINib(nibName: "ChatRoomTableViewCell", bundle: nil), forCellReuseIdentifier: cellId)
        ChatRoomTableView.backgroundColor = UIColor{_ in return #colorLiteral(red: 0.7822921872, green: 0.5987234712, blue: 0.5070788264, alpha: 1)}
        fetchMessage()

    }

    override var inputAccessoryView: UIView? {
        get{
            return chatInputAccessoryView
        }
    }
    override var canBecomeFirstResponder: Bool{
        return true
    }
    private func fetchMessage(){
        guard let chatroomDocId = chatroom?.documentID else { return }


        Firestore.firestore().collection("chatRooms").document(chatroomDocId).collection("messages").addSnapshotListener { snapshots, error in
            guard let snapshot = snapshots else {
                print("error")
                return
            }
            snapshot.documentChanges.forEach({ documentChange in
    //ここのforEach関数がdocumentChangesがnilで動きません。
                if (documentChange.type == .added){
                    let dic = documentChange.document.data()
                    let message = Message(dic: dic)
                    self.messages.append(message)
                    self.ChatRoomTableView.reloadData()
                }
            })
        }
    }


}

extension ChatRoomViewController: ChatInputAccessoryViewdelegate{
    func tappedSendButtun(text: String) {
//        messages.append(text)
        guard let chatroomDocId = chatroom?.documentID else { return }
        guard let name = user?.username else { return }
        guard let uid = Auth.auth().currentUser?.uid else { return }
        chatInputAccessoryView.removeText()

        let docData = [
            "name": name,
            "createdAt": Timestamp(),
            "uid": uid,
            "message": text
        ] as [String : Any]
        Firestore.firestore().collection("chatRooms").document(chatroomDocId).collection("message").document().setData(docData) { (err) in
            if err != nil{
                print("message情報の保存に失敗しました。")
                return
            }
            print("message情報ありがとう")
        }
//        ChatRoomTableView.reloadData()

    }


}


extension ChatRoomViewController: UITableViewDelegate, UITableViewDataSource{

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        ChatRoomTableView.estimatedRowHeight = 20
        return UITableView.automaticDimension
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return messages.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = ChatRoomTableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! ChatRoomTableViewCell
        cell.message = messages[indexPath.row]
        return cell
    }
}
0 likes

No Answers yet.

Your answer might help someone💌