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
具有自己的视图模型,设置方式与上面相同
在某种程度上,这一切都很有效
MyChatControllerViewModel
调用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)
}
}
这将新消息推送到myUITableView
中,然后重新加载数据,显示消息
但是,my child view控制器,然后是UICollectionView
也与ChatService
对话-它包含一系列触发响应的水平滚动按钮
当按下一个按钮时,我可以通过日志查看,我的聊天服务被调用,逻辑按预期运行,但是在聊天服务调用var pushResponse:((uresponse:ChatMessage)->Void)?
我的视图控制器不更新
我怀疑这是因为我的UICollectionView正在与未建立绑定的ChatService
的另一个实例通信
这听起来可信吗?如果是这样的话,什么才是否定这个问题的正确方法?我考虑过使用委托模式,但不确定应该委托什么以及委托到哪里
要提供布局的一些上下文,请执行以下操作:
我有一个垂直显示聊天信息的表格视图。
在视图的底部,我有一个集合视图,显示水平滚动的按钮
按下这些按钮调用聊天服务,这将触发与表视图模型的绑定,这将使用新数据重新加载表视图。您正在集合视图中创建一个新的
聊天服务实例,该实例没有绑定设置
如果您不想使用Singleton,我会在您的父most组件中创建一个实例,并通过传递。在添加聊天历史记录后,是否重新加载集合视图?否,但是聊天历史记录显示在tableview中,我认为视图模型和视图之间的绑定应该调用它。但是您的视图模型如何知道一旦聊天历史发生变化,我就必须加载视图呢?我认为在添加ChatHistory后,您需要在此处调用视图模型的reloadData方法抱歉,是的,我错过了该片段,这已经发生了。该过程可以工作,当我的表视图模型与聊天服务对话时,我的集合视图模型与之对话时,视图不会更新。