2014-08-13 4 views
5

Может ли кто-нибудь объяснить мне, как реализовать шаблон MVVM, когда проект включает в себя Storyboard?MVVM pattern and Storyboard iOS

Во многих примерах я увидел, что мне нужно использовать файлы .xib. И initViewControllers так:

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

    self = [super init]; 

    if(self){ 

     _viewModel = viewModel; 
    } 

    return self; 
} 

Но с раскадровки я не могу initviewControllers, раскадровка делает это для меня. Должен ли я использовать свойства вместо этого?

т.е.

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

сам является UITabBarController.

ответ

8

Вы можете инициализировать viewModel свойства в prepareForSegue:sender: методы вашего UIViewController

Вот ссылка на отличный образец 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]; 
    } 
} 
+0

Хм ... Означает ли это, что в Swift свойство 'viewModel' контроллера вида необходимо неявно разворачивать? –

+0

Я так думаю. Вот пример реального мира приложения MVVM в быстром (с раскадными версиями): https://github.com/artsy/eidolon. Они создают модели представления внутри контроллеров представления (как «lazy var'), но они предоставляют параметры в' prepareForSegue' через явно развернутые опции. – Anton

+0

err ... через неявно развернутые опции. – Anton