这是用于解释我的项目中的问题的示例图片。
我在这里有一个选项卡式 View Controller ,在一个选项卡中我有 指南简介列表 ,在其他标签中我有 聊天列表我已经做好了。
有一个chatScreenViewController..(像这样的示例图片)
这个单一的聊天 View Controller 以两种方式加载,
(1) 当我从聊天选项卡中的对话列表中单击任何对话时。
(2) 在引导配置文件屏幕中有一个 聊天 按钮,当我单击那个实例化 singleChatViewController 并加载到导航堆栈中的聊天按钮时。
每当加载此 View Controller 时,都会调用此函数,即此函数将监听器添加到 firebase 文档,以便它可以监听任何发送的消息。
func loadUpChatModel()
{
guard let chateeInfo = self.chateeInfoStruct
else
{
print("chateeInfoStruct from previous vc is not set")
return
}
let chatId = chateeInfo.chatId
setTouristReadValueToTrue(chatId: chatId)
let chatRef = Firestore.firestore().collection("chats").document(chatId)
self.listner = chatRef.addSnapshotListener
{ (chatDocument, error) in
if let err = error
{
print(err.localizedDescription)
print("error getting a chat document")
}
else
{
if chatDocument != nil, chatDocument!.exists
{
guard let data = chatDocument!.data()
else
{
print("unable to convert data of single chat for chat list model")
return
}
if let model = self.chatModel
{
let oldTotalMessages = model.totalMessages!
let newTotalMessages = data["totalMessages"] as! Int
let messagesAdded = newTotalMessages - oldTotalMessages
var i = 0
while i < messagesAdded
{
let message = data["message\(oldTotalMessages+i+1)"] as? String ?? "Unable to retrieve"
let messageSentStatus = data["message\(oldTotalMessages+i+1)sent"] as? Bool ?? false
let block = messageBlock(message: message, messageWasSent: messageSentStatus)
self.chatModel!.messagesArray.append(block)
i += 1
}
self.chatModel!.lastMessageDate = data["lastMessageDate"] as? String ?? "date not found for this chat"
self.chatModel!.totalMessages = newTotalMessages
self.updateTableView()
}
else
{
let lastMessageDate = data["lastMessageDate"] as? String ?? "date not found for this chat"
let totalMessages = data["totalMessages"] as? Int ?? 0
let singleChatModel = SingleChatDM(chatId: chatId, lastMessageDate: lastMessageDate, totalMessages: totalMessages)
var i = 0
while i < totalMessages
{
let message = data["message\(i+1)"] as? String ?? "Unable to retrieve"
let messageSentStatus = data["message\(i+1)sent"] as? Bool ?? false
let block = messageBlock(message: message, messageWasSent: messageSentStatus)
singleChatModel.messagesArray.append(block)
i += 1
}
self.chatModel = singleChatModel
self.updateTableView()
}
}
}
}
}
如果我在一个选项卡中打开一个聊天,它可以正常工作,发送和接收消息并且表格 View 正确加载。但是,当我也通过单击同一指南配置文件中的聊天按钮在其他选项卡中加载此 View Controller 时,该指南配置文件中的单个聊天已加载到其他选项卡中,问题就出现了。
现在,当我发送消息时,数据已正确存储到 firebase 文档但我的 TableView 未更新,我看不到我在两个 View Controller 中发送的新消息。 (这在我看来非常重要,因为我没有收到任何更新的文档快照,即监听器不工作)。
关于这种行为的任何帮助!我搜索了但我找不到任何有用的东西。
最佳答案
您可以通过 super 全局变量检查事件 View Controller ,如果设置了该变量,则无需再次加载该 View Controller ,而是使已加载聊天 View Controller 的选项卡处于事件状态。不是永久解决方案,但我认为这可能有效!
关于ios - 在另一个选项卡中加载相同的 View Controller 时,文档快照监听器不起作用! - swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62894680/