视图模型应该对视图控制器中的事件做出反应吗?

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子类(考虑在PersonTableViewCellPersonDetailsViewController 中有一个PersonViewModel,在点击一个单元格后显示 - 我认为这是一个很常见的场景。

如果您在视图模型中以某种方式观察到viewWillDisappear,它与UIViewController 子类紧密耦合,不能与UIView 子类一起使用。

视图模型的更新应该通过以下方式在视图控制器中调用:

- (void)viewWillDisappear:(BOOL)animated
  [super viewWillDisappear:animated];
  [self.viewModel updateStuff];

【讨论】:

嘿,这很有道理!感谢您的回答和分享该帖子,教会了我很多。

以上是关于视图模型应该对视图控制器中的事件做出反应吗?的主要内容,如果未能解决你的问题,请参考以下文章

未解决的对视图模型的引用

AngularJS 中的视图未更新

MVC中视图和模型之间的通信

具有封装/防御性编程的 MVC(模型视图控制器)

何时在 WPF 中对命令使用事件?

ER模型就和Access里面的关系视图一样吗?