MVVM模式和故事板iOS

6

有人可以解释一下在项目中包含Storyboard时如何实现MVVM模式吗?

在许多示例中,我看到我必须使用.xib文件。并像这样初始化视图控制器

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

    self = [super init];

    if(self){

        _viewModel = viewModel;
    }

    return self;
}

但是使用Storyboard时,我无法initviewControllers,Storyboard会为我完成这个过程。 我应该使用属性吗? 例如:
UINavigationController *nav = (UINavigationController *)[self.viewControllers objectAtIndex:0];
HomeViewController *hvc = (HomeViewController *)[nav.viewControllers objectAtIndex:0];
hvc.viewModel = viewModel;

self是UITabBarController

2个回答

8
你可以在prepareForSegue:sender:方法中初始化你的UIViewController类中的viewModel属性。
这是一个很好的MVVM示例应用:Ash Furrow的C-41应用 以下是该应用程序中初始化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属性需要隐式解包? - George Marmaridis
我想是这样的。这里有一个使用Swift(带有storyboards)的MVVM应用程序的真实世界示例:https://github.com/artsy/eidolon。他们在视图控制器内创建视图模型(作为`lazy var),但是他们通过显式解包可选项在prepareForSegue`中提供参数。 - Anton
通过隐式解包可选项来处理错误。 - Anton

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接