我正在考虑用于测试应用程序的非常简单的ViewModel和ViewController的结构。我有类似的东西:
FirstViewController.m:
- (IBAction)launchButtonSelected:(id)sender
{
[self.viewModel launchActionSelected];
}
FirstViewModel.m:
- (void)launchActionSelected
{
// [todo] - Figure this out.
}
在launchButton
中选择FirstViewController
后,我想制作并展示SecondViewController
。
我的问题:
SecondViewController
的ViewModel?SecondViewController
?SecondViewController
推送到视图层次结构中? (即导航推送或模态演示)。我个人在想:
SecondViewController
的ViewModel可能会在其初始化程序中创建。这总是让我陷入困惑的道路:如果我想将信息从FirstViewModel
传递到SecondViewModel
怎么办?我应该在SecondViewModel
上公开SecondViewController
作为公共财产,以便我可以获取/设置值吗?FirstViewController
应创建SecondViewController
和FirstViewController
应将SecondViewController
推送到屏幕上。我的直觉认为这是次要的:我想更多地分离ViewControllers的演示文稿,并让应用程序更专注于ViewModel,但这似乎很难做到。 (即“推”ViewModels,而不是ViewControllers ......但“推”与应用程序的视觉呈现本质上相关,所以也许这是错误的思考方式。)
答案 0 :(得分:13)
很棒的问题。重要的是要记住,无论如何,在iOS上,MVVM是一种新兴的范例,具有新兴的最佳实践。因此,关于硬性规则的第一个问题的答案是,实际上并没有。我个人会在SecondViewController
的视图模型中创建FirstViewController
的视图模型,因此可以在它将被使用的上下文中进行配置(即:如果正在推入新的视图控制器)响应表视图选择,索引路径)。你对其他两个问题的回答是正确的,至少在我对iOS上的MVVM的解释中是这样。
View模型不应该有权访问您的视图,并且由于MVVM将视图和视图控制器形式化为一个单元,因此它们也不应该创建或推送视图控制器。希望有道理。
我在GitHub上写了一个使用MVVM的应用程序。你可以查看here。