Подтвердить что ты не робот

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" по сути связан с визуальной презентацией приложения, поэтому, возможно, это неправильный способ подумать об этом.)

4b9b3361

Ответ 1

Отличные вопросы. Важно помнить, что на iOS в любом случае MVVM представляет собой новую парадигму с новыми передовыми методами. Поэтому ответ на ваш первый вопрос о жестких правилах заключается в том, что на самом деле их нет. Я лично создал бы модель представления SecondViewController в модели представления FirstViewController, чтобы ее можно было сконфигурировать в том контексте, в котором она будет использоваться (т.е. Если новый контроллер представления будет нажат в ответ на выбор вида таблицы, индексный путь). Ваши ответы на два других вопроса верны, по крайней мере, в моей интерпретации MVVM на iOS.

Просмотр моделей не должен иметь доступа к вашим представлениям, и поскольку MVVM формализует контроллер представления и представления как единое целое, они также не должны создавать или нажимать на контроллеры представлений. Надеюсь, это имеет смысл.

У меня есть приложение, которое я написал в GitHub, который использует MVVM. Вы можете проверить это здесь.