创建新对话框时未调用委托方法

Posted

技术标签:

【中文标题】创建新对话框时未调用委托方法【英文标题】:No delegate method called when new dialog created 【发布时间】:2018-01-31 15:30:23 【问题描述】:

我有一个对话框列表,当新消息发布到现有对话框时,这些对话框会按预期更新。

当有人在新对话框中向我发送新消息(即不在表格视图中的消息)时,没有任何更新。似乎没有调用任何委托方法,即使我已经输入并记录了每个 QBChatDelegateQBChatServiceDelegate 方法。

我已经设置好了,所以当我转到另一个视图并返回表视图时,它会手动检索对话框并重新加载表视图。不过我需要这个自动更新。

我错过了什么?

编辑:当当前登录用户以外的其他人创建新对话框时,应该触发哪个委托方法?

编辑:更多上下文的一些代码......

在我的课堂上,我将其设置为 QBChatDelegateQBChatServiceDelegate

QBChat.instance.addDelegate(self) self.chatService.addDelegate(self)

然后我将当前用户登录到 QuickBlox;

self.currentUser.blobID = qbUserID
self.currentUser.login = qbUsername
self.currentUser.password = qbPassword

self.services.logIn(with: self.currentUser, completion:  (success, errorMessage) in

    guard success, errorMessage == nil else 
        self.log.error("quickblox: \(errorMessage!)")
        return
    

    self.chatService.connect(completionBlock:  (error) in
        guard error == nil else 
            self.log.error("chatService.connect: \(error!.localizedDescription)")
            return
        
    )

)

然后我为QBChatDelegateQBChatServiceDelegate 调用所有可能的委托方法;

// QMChatServiceDelegate

func chatService(_ chatService: QMChatService, didAddChatDialogToMemoryStorage chatDialog: QBChatDialog) 
    self.log.info()
    self.notifyOfNewMessage()
    self.delegate?.didCreateDialogs()


func chatService(_ chatService: QMChatService, didAddChatDialogsToMemoryStorage chatDialogs: [QBChatDialog]) 
    self.log.info()
    self.notifyOfNewMessage()
    self.delegate?.didCreateDialogs()


func chatService(_ chatService: QMChatService, didUpdateChatDialogInMemoryStorage chatDialog: QBChatDialog) 
    self.log.info()
    self.notifyOfNewMessage()
    self.delegate?.didUpdateDialogs([chatDialog])


func chatService(_ chatService: QMChatService, didUpdateChatDialogsInMemoryStorage dialogs: [QBChatDialog]) 
    self.log.info()
    self.notifyOfNewMessage()
    self.delegate?.didUpdateDialogs(dialogs)


func chatService(_ chatService: QMChatService, didDeleteChatDialogWithIDFromMemoryStorage chatDialogID: String) 
    self.log.info()
    self.notifyOfNewMessage()
    self.delegate?.didDeleteDialogs()


func chatService(_ chatService: QMChatService, didAddMessageToMemoryStorage message: QBChatMessage, forDialogID dialogID: String) 
    self.log.info()
    self.notifyOfNewMessage()
    self.delegate?.didCreateMessages()


func chatService(_ chatService: QMChatService, didAddMessagesToMemoryStorage messages: [QBChatMessage], forDialogID dialogID: String) 
    self.log.info()
    self.notifyOfNewMessage()
    self.delegate?.didCreateMessages()


func chatService(_ chatService: QMChatService, didUpdate message: QBChatMessage, forDialogID dialogID: String) 
    self.log.info()


func chatService(_ chatService: QMChatService, didUpdate messages: [QBChatMessage], forDialogID dialogID: String) 
    self.log.info()


func chatService(_ chatService: QMChatService, didReceiveNotificationMessage message: QBChatMessage, createDialog dialog: QBChatDialog) 
    self.log.info()


func chatService(_ chatService: QMChatService, didLoadMessagesFromCache messages: [QBChatMessage], forDialogID dialogID: String) 
    self.log.info()


func chatService(_ chatService: QMChatService, didDeleteMessageFromMemoryStorage message: QBChatMessage, forDialogID dialogID: String) 
    self.log.info()


func chatService(_ chatService: QMChatService, didDeleteMessagesFromMemoryStorage messages: [QBChatMessage], forDialogID dialogID: String) 
    self.log.info()


func chatService(_ chatService: QMChatService, didLoadChatDialogsFromCache dialogs: [QBChatDialog], withUsers dialogsUsersIDs: Set<NSNumber>) 
    self.log.info()


// QBChatDelegate

func chatDidReceive(_ message: QBChatMessage) 
    self.log.info()



func chatRoomDidReceive(_ message: QBChatMessage, fromDialogID dialogID: String) 
    self.log.info(message.text)


编辑:删除了不相关的委托方法和对 tableview 的引用,因为它与 在创建新对话框时没有调用委托方法的问题无关

【问题讨论】:

总是包含相关代码.. 这就像通过一条短信诊断患者,他说他感觉不舒服.. 你必须用tableView.reloadData()重新加载你的tableView @MilanNosáľ 老实说,我不确定是否可以添加任何代码。正如我所说,我已经实现了两个独立对象的每个委托方法。其中一个应该捕获一个新对话框,但没有一个。 嗯,大多数时候问题出在代码上,因为它并没有真正实现开发人员认为的那样。这就是你的情况——你相信你正确地实现了它,但它的行为却不是这样。现在你认为我们应该如何给你任何建议,当你真的只向我们展示你的假设时,他们有什么问题?有数千种可能的原因可能导致这种情况.. @MilanNosáľ 问题已用代码更新 【参考方案1】:

您是否在发送/接收新消息时执行 tableView.reloadData()。

确保更新用于返回 tableView 部分中的行数的数据结构。

【讨论】:

我知道何时收到 existing 对话框中的新消息,但不知道何时收到新对话框中的新消息 - 没有调用委托方法。如果调用了一个委托方法,上面写着“嘿,我刚刚收到一个新对话框和消息”,那么我将重新加载表格视图。

以上是关于创建新对话框时未调用委托方法的主要内容,如果未能解决你的问题,请参考以下文章

Android - 单击按钮时未显示权限对话框

隐藏时未调用委托方法

iOS:首次加载时未调用 iCarousel 委托方法

使用 xmpp 框架时未调用委托方法

实现我自己的委托时未调用 UIAlertViewDelegate 方法 clickedButtonAtIndex

在 UITableviewCell 中使用 UICollection 视图时未调用 UICollectionView 委托方法“didSelectItemAtIndexPath”