MVVM и нажатие ViewController: где инициализировать следующий ViewController и ViewModel и нажать на новое представление?
Я рассматриваю структуру очень простого ViewModel и ViewController для тестового приложения. У меня есть что-то похожее:
FirstViewController.m:
- (IBAction)launchButtonSelected:(id)sender
{
[self.viewModel launchActionSelected];
}
FirstViewModel.m:
- (void)launchActionSelected
{
// [todo] - Figure this out.
}
Когда launchButton
выбран в FirstViewController
, я хочу сделать и представить SecondViewController
.
Мои вопросы:
- Есть ли твердое эмпирическое правило, где я должен создать
SecondViewController
ViewModel?
- Кто должен инициализировать
SecondViewController
?
- Где я должен нажать
SecondViewController
на иерархию представления? (то есть навигация или модальное представление).
Я лично думал:
- ViewModel для
SecondViewController
, вероятно, будет создан в его инициализаторе. Это всегда приводит меня к запутанному пути: что, если я хочу передавать информацию от FirstViewModel
до SecondViewModel
? Должен ли я открыть SecondViewModel
как общедоступное свойство на SecondViewController
, чтобы я мог получить/установить значения на нем?
-
FirstViewController
должен создать SecondViewController
и
-
FirstViewController
должен нажать SecondViewController
на экран.
Моя интуиция считает это subpar: я хотел бы изолировать презентацию ViewControllers немного больше, и приложение больше ориентировано на ViewModel, но это кажется трудным сделать. (т.е. "push" ViewModels, а не ViewControllers... но "push" по сути связан с визуальной презентацией приложения, поэтому, возможно, это неправильный способ подумать об этом.)
Ответы
Ответ 1
Отличные вопросы. Важно помнить, что на iOS в любом случае MVVM представляет собой новую парадигму с новыми передовыми методами. Поэтому ответ на ваш первый вопрос о жестких правилах заключается в том, что на самом деле их нет. Я лично создал бы модель представления SecondViewController
в модели представления FirstViewController
, чтобы ее можно было сконфигурировать в том контексте, в котором она будет использоваться (т.е. Если новый контроллер представления будет нажат в ответ на выбор вида таблицы, индексный путь). Ваши ответы на два других вопроса верны, по крайней мере, в моей интерпретации MVVM на iOS.
Просмотр моделей не должен иметь доступа к вашим представлениям, и поскольку MVVM формализует контроллер представления и представления как единое целое, они также не должны создавать или нажимать на контроллеры представлений. Надеюсь, это имеет смысл.
У меня есть приложение, которое я написал в GitHub, который использует MVVM. Вы можете проверить это здесь.