[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