【问题标题】:MVVM pattern and Storyboard iOSMVVM 模式和 Storyboard iOS
【发布时间】:2014-08-13 09:22:46
【问题描述】:

当项目包含 Storyboard 时,有人可以解释我如何实现 MVVM 模式吗?

在许多示例中,我看到我必须使用.xib 文件。还有initViewControllers这样的:

-(instancetype)initWithModelView:(ViewModel *)viewModel{

    self = [super init];

    if(self){

        _viewModel = viewModel;
    }

    return self;
}

但是使用 Storyboard 我不能 init viewControllers,storyboard 为我做了。 我应该改用属性吗?

UINavigationController *nav = (UINavigationController *)[self.viewControllers objectAtIndex:0];
HomeViewController *hvc = (HomeViewController *)[nav.viewControllers objectAtIndex:0];
hvc.viewModel = viewModel;

自己是UITabBarController

【问题讨论】:

    标签: ios design-patterns mvvm


    【解决方案1】:

    您可以在UIViewControllerprepareForSegue:sender: 方法中初始化viewModel 属性

    这里是一个很棒的示例 MVVM 应用程序的链接C-41 by Ash Furrow

    该应用中viewModel 初始化的示例:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        if ([[segue identifier] isEqualToString:@"showDetail"]) {
            NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    
            ASHDetailViewController *viewController = segue.destinationViewController;
            viewController.viewModel = [self.viewModel detailViewModelForIndexPath:indexPath];
        } else if ([[segue identifier] isEqualToString:@"editRecipe"]) {
            ASHEditRecipeViewController *viewController = (ASHEditRecipeViewController *)[segue.destinationViewController topViewController];
            viewController.viewModel = [self.viewModel editViewModelForNewRecipe];
        }
    }
    

    【讨论】:

    • 嗯...这是否意味着在 Swift 中视图控制器的 viewModel 属性需要被隐式解包?
    • 我想是的。这是 Swift 中 MVVM 应用程序的真实示例(带有故事板):github.com/artsy/eidolon。他们在视图控制器中创建视图模型(如lazy var),但他们通过显式展开的选项在prepareForSegue 中提供参数。
    • err... 通过隐式展开的选项。
    【解决方案2】:

    我认为使用 coordinatorRX 处理视图之间导航的最佳方式。 这将具有关注点分离的概念。

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 2018-03-25
      • 1970-01-01
      • 2017-06-16
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      相关资源
      最近更新 更多