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

cbo*_*wns 13 mvvm ios reactive-cocoa

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

FirstViewController.m:

- (IBAction)launchButtonSelected:(id)sender
{
    [self.viewModel launchActionSelected];
}
Run Code Online (Sandbox Code Playgroud)

FirstViewModel.m:

- (void)launchActionSelected
{
    // [todo] - Figure this out.
}
Run Code Online (Sandbox Code Playgroud)

当在launchButton中选中时FirstViewController,我想制作并呈现一个SecondViewController.

我的问题:

  1. 我应该在哪里创建SecondViewControllerViewModel 有一个可靠的经验法则吗?
  2. 谁应该初始化SecondViewController
  3. 我应该在哪里推进SecondViewController视图层次结构?(即导航推送或模态演示).

我个人在想:

  1. ViewModel for SecondViewController可能会在其初始化程序中创建.这总是让我走上一条令人困惑的道路:如果我想将信息传递FirstViewModel给我SecondViewModel怎么办?我应该公开SecondViewModel作为公共财产,SecondViewController以便我可以获得/设定价值吗?
  2. FirstViewController应该创造SecondViewController,和
  3. FirstViewController应该推SecondViewController到屏幕上.

我的直觉认为这是次要的:我想更多地隔离ViewControllers的呈现,让应用程序更专注于ViewModel,但这似乎很难做到.(即"推"ViewModels,而非ViewControllers ......但"推"与应用程序的视觉呈现本质上相关,所以也许这是错误的思考方式.)

Ash*_*row 13

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

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

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