Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从其他视图模型调用服务时未触发绑定事件_Ios_Swift_Mvvm - Fatal编程技术网

Ios 从其他视图模型调用服务时未触发绑定事件

Ios 从其他视图模型调用服务时未触发绑定事件,ios,swift,mvvm,Ios,Swift,Mvvm,我有一个父级UIViewController,它声明了自己的视图模型 lazy var chatService: ChatService = { let chatService = ChatService() return chatService }() lazy var viewModel: ChatControllerViewModel = { let viewModel = ChatControllerViewModel(chatService: chatServ

我有一个父级
UIViewController
,它声明了自己的视图模型

lazy var chatService: ChatService = {
    let chatService = ChatService()
    return chatService
}()

lazy var viewModel: ChatControllerViewModel = {
    let viewModel = ChatControllerViewModel(chatService: chatService)
    return viewModel
}()
   lazy var tableView: UITableView = {
        let tableView = UITableView(frame: .zero)
        return tableView
    }()
此视图控制器有一个
UITableView
声明为

lazy var chatService: ChatService = {
    let chatService = ChatService()
    return chatService
}()

lazy var viewModel: ChatControllerViewModel = {
    let viewModel = ChatControllerViewModel(chatService: chatService)
    return viewModel
}()
   lazy var tableView: UITableView = {
        let tableView = UITableView(frame: .zero)
        return tableView
    }()
viewDidLoad
内部,我有一个这样的绑定

    viewModel.reloadData = { [weak self] in
        self?.insertNewMessage()
    }
这将触发以下方法

fileprivate func insertNewMessage() {
    let indexPath = IndexPath(row: viewModel.history.count - 1, section: 0)
    tableView.beginUpdates()
    tableView.insertRows(at: [indexPath], with: .fade)
    tableView.endUpdates()
    tableView.scrollToRow(at: indexPath, at: .bottom, animated: true)
}
这很好用。我还有一个子视图控制器,其类型为
UICollectionViewController
,声明为

lazy var chatQuestionsCollectionView: ChatQuestionsController = {
    let layout = SnappingCollectionViewLayout()
    let cv = ChatQuestionsController(collectionViewLayout: layout)
    return cv
}()
UICollectionViewController
具有自己的视图模型,设置方式与上面相同

在某种程度上,这一切都很有效

My
ChatControllerViewModel
调用ChatService并请求最新消息,这些消息随后从ChatService推送到My View模型

聊天服务

var pushResponse: ((_ response: ChatMessage) -> Void)?
ChatControllerViewModel

   init(chatService: ChatService = ChatService()) {
        self.chatService = chatService

        chatService.pushResponse = { [weak self] response in
            self?.chatHistory.append(response)
        }
    }
这将新消息推送到my
UITableView
中,然后重新加载数据,显示消息

但是,my child view控制器,然后是
UICollectionView
也与
ChatService
对话-它包含一系列触发响应的水平滚动按钮

当按下一个按钮时,我可以通过日志查看,我的聊天服务被调用,逻辑按预期运行,但是在聊天服务调用
var pushResponse:((uresponse:ChatMessage)->Void)?
我的视图控制器不更新

我怀疑这是因为我的UICollectionView正在与未建立绑定的
ChatService
的另一个实例通信

这听起来可信吗?如果是这样的话,什么才是否定这个问题的正确方法?我考虑过使用委托模式,但不确定应该委托什么以及委托到哪里

要提供布局的一些上下文,请执行以下操作:

我有一个垂直显示聊天信息的表格视图。 在视图的底部,我有一个集合视图,显示水平滚动的按钮


按下这些按钮调用聊天服务,这将触发与表视图模型的绑定,这将使用新数据重新加载表视图。

您正在集合视图中创建一个新的
聊天服务实例,该实例没有绑定设置


如果您不想使用Singleton,我会在您的父most组件中创建一个实例,并通过传递。

在添加聊天历史记录后,是否重新加载集合视图?否,但是聊天历史记录显示在tableview中,我认为视图模型和视图之间的绑定应该调用它。但是您的视图模型如何知道一旦聊天历史发生变化,我就必须加载视图呢?我认为在添加ChatHistory后,您需要在此处调用视图模型的reloadData方法抱歉,是的,我错过了该片段,这已经发生了。该过程可以工作,当我的表视图模型与聊天服务对话时,我的集合视图模型与之对话时,视图不会更新。