MVVM并推送ViewController:在哪里初始化下一个ViewController和ViewModel,并推送新视图?

时间:2014-02-20 23:56:58

标签: ios mvvm reactive-cocoa

我正在考虑用于测试应用程序的非常简单的ViewModel和ViewController的结构。我有类似的东西:

FirstViewController.m:

- (IBAction)launchButtonSelected:(id)sender
{
    [self.viewModel launchActionSelected];
}

FirstViewModel.m:

- (void)launchActionSelected
{
    // [todo] - Figure this out.
}

launchButton中选择FirstViewController后,我想制作并展示SecondViewController

我的问题:

  1. 我应该在哪里创建SecondViewController的ViewModel?
  2. 是否有可靠的经验法则?
  3. 谁应该初始化SecondViewController
  4. 我应该将SecondViewController推送到视图层次结构中? (即导航推送或模态演示)。

  5. 我个人在想:

    1. SecondViewController的ViewModel可能会在其初始化程序中创建。这总是让我陷入困惑的道路:如果我想将信息从FirstViewModel传递到SecondViewModel怎么办?我应该在SecondViewModel上公开SecondViewController作为公共财产,以便我可以获取/设置值吗?
    2. FirstViewController应创建SecondViewController
    3. FirstViewController应将SecondViewController推送到屏幕上。
    4. 我的直觉认为这是次要的:我想更多地分离ViewControllers的演示文稿,并让应用程序更专注于ViewModel,但这似乎很难做到。 (即“推”ViewModels,而不是ViewControllers ......但“推”与应用程序的视觉呈现本质上相关,所以也许这是错误的思考方式。)

1 个答案:

答案 0 :(得分:13)

很棒的问题。重要的是要记住,无论如何,在iOS上,MVVM是一种新兴的范例,具有新兴的最佳实践。因此,关于硬性规则的第一个问题的答案是,实际上并没有。我个人会在SecondViewController的视图模型中创建FirstViewController的视图模型,因此可以在它将被使用的上下文中进行配置(即:如果正在推入新的视图控制器)响应表视图选择,索引路径)。你对其他两个问题的回答是正确的,至少在我对iOS上的MVVM的解释中是这样。

View模型不应该有权访问您的视图,并且由于MVVM将视图和视图控制器形式化为一个单元,因此它们也不应该创建或推送视图控制器。希望有道理。

我在GitHub上写了一个使用MVVM的应用程序。你可以查看here