视图模型应该对视图控制器中的事件做出反应吗?
Posted
技术标签:
【中文标题】视图模型应该对视图控制器中的事件做出反应吗?【英文标题】:Should a View Model react to events in the View Controller? 【发布时间】:2015-12-15 11:59:21 【问题描述】:在项目的某些部分采用 ReactiveCocoa 时,我已经实施 MVVM 范式已有一段时间了。我有一个关于与视图相关的对象的生命周期的简单问题。
想象一下,每当View
从屏幕上消失时,View
模型就需要更新对象中的某些内容。是否应该由ViewController
调用此更新,或者View
模型可以观察例如ViewController
中的viewWillDisappear 选择器并对其做出反应?那会是个坏习惯吗?
【问题讨论】:
【参考方案1】:您使用 MVVM 模式是为了将视图(以及视图控制器,在 Cocoa 中也被视为视图层的一部分)与模型解耦。这意味着视图模型不应该知道任何关于视图控制器的信息。
如this post 中所述,理想情况下,您甚至不应该在视图模型中导入UIKit
。
换句话说,视图模型应该可重用于以不同方式显示相同数据:您可能希望在视图控制器中显示数据和在其他地方的普通UIView
子类(考虑在PersonTableViewCell
和PersonDetailsViewController
中有一个PersonViewModel
,在点击一个单元格后显示 - 我认为这是一个很常见的场景。
如果您在视图模型中以某种方式观察到viewWillDisappear
,它与UIViewController
子类紧密耦合,不能与UIView
子类一起使用。
视图模型的更新应该通过以下方式在视图控制器中调用:
- (void)viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
[self.viewModel updateStuff];
【讨论】:
嘿,这很有道理!感谢您的回答和分享该帖子,教会了我很多。以上是关于视图模型应该对视图控制器中的事件做出反应吗?的主要内容,如果未能解决你的问题,请参考以下文章