iOS MVVM обрабатывает начальное состояние просмотра

Я пытаюсь использовать MVVM без Rx в Objective C, в основном что-то вроде MVP. У меня есть некоторые очень основные сомнения, которые я хотел бы прояснить

1.) Как загрузить начальное состояние просмотра в зависимости от конфигурации. т.е. когда начальное состояние компонентов пользовательского интерфейса может меняться в зависимости от некоторых значений конфигурации. Например Кнопку в представлении можно изначально включить / отключить / скрыть в зависимости от глобальной конфигурации. Как должно отображаться это начальное состояние представления, когда в представлении может быть много компонентов пользовательского интерфейса?

  • Должна ли модель представления передавать этот конфиг (или объект состояния просмотра) для просмотра, и представление решает, как визуализировать себя? или же
  • Должна ли модель представления передавать состояние каждого элемента пользовательского интерфейса в представление?
  • В случае Rx должна ли VM иметь одно свойство состояния представления или свойства состояния каждого компонента пользовательского интерфейса?

2.) Как обрабатывать состояния отдельных компонентов пользовательского интерфейса?

  • Если VM когда-либо попросит представление обновить свое состояние представления с помощью таких методов, как enableButton1, hideTextView и т. Д., Или
  • Он должен просто передать "события" или данные в представление и позволить представлению решить, как реагировать на эти события.
  • В мире Rx следует просматривать привязку с отдельными свойствами состояния или просто свойства события?

3.) Я запутался, кто должен запускать определенные операции, например, скажем, "проверка". Например, на экране входа в систему кто должен инициировать проверку значений электронной почты / пароля?

  • Должен отобразиться запрос на проверку виртуальной машины, а затем запрос на выполнение процесса входа в систему или
  • Должно ли представление просто передать действие щелчка ВМ со значениями электронной почты / пароля, и ВМ решает, следует ли выполнить проверку или нет, и что делать, если она прошла или не прошла?

1 ответ

Решение

Ух ты, в этот вопрос упаковано много вопросов... Посмотрим, что я могу дразнить:

Как должно отображаться это начальное состояние представления, когда в представлении может быть много компонентов пользовательского интерфейса?

Когда не используется реактивная система, будь то в Objective-C или Swift, мои контроллеры представления заканчиваются configureWithViewModel: (Obj-C) или configure(viewModel:) (быстрая) функция, которая вызывается в viewDidLoad и каждый раз, когда модель представления изменяется. Начальное состояние отображается в viewDidLoad при вызове метода configure.

Должна ли модель представления передавать этот конфиг (или объект состояния просмотра) для просмотра, и представление решает, как визуализировать себя? Должна ли модель представления передавать состояние каждого элемента пользовательского интерфейса в представление?

Представление решает, как визуализировать себя, viewModel решает, какими должны быть значения. ViewModel имеет дело только с теми частями представления, которые являются динамическими. Так, например, если единственное, что будет отличаться в UILabel, это текст, то viewModel предоставляет строку для текста. Если UILabel также меняет textColor, тогда viewModel предоставляет как String, так и UIColor.

В случае Rx должна ли VM иметь одно свойство состояния представления или свойства состояния каждого компонента пользовательского интерфейса?

Лично я даю viewModel отдельную Observable для каждого динамического фрагмента, но в контексте без Rx я чувствую, что это слишком сложно и будет иметь только один update это обеспечивает все состояние одновременно.

Как обрабатывать состояния отдельных компонентов пользовательского интерфейса?

  • Если VM когда-либо попросит представление обновить свое состояние представления с помощью таких методов, как enableButton1, hideTextView и т. Д., Или
  • Он должен просто передать "события" или данные в представление и позволить представлению решить, как реагировать на эти события.

Через данные. Мнение не решает все же. Например UIButton имеет isEnabled имущество. Данные в этом случае, очевидно, Bool, ViewModel предоставляет Bool, а ViewController просто присваивает это bool представлению (или представление назначает его себе).

В мире Rx следует просматривать привязку с отдельными свойствами состояния или просто свойства события?

Государственные свойства. что-то вроде:

viewModel.isMyButtonEabled
    .bind(to: myButton.rx.isEnabled)

Я запутался, кто должен запускать определенные операции, например, скажем, "проверка". Например, на экране входа в систему кто должен инициировать проверку значений электронной почты / пароля?

Формулировка выше немного сбивает с толку. Ничто не "запускает операции". Входные части представления информируют модель представления, когда что-то было введено, и модель представления либо игнорирует этот ввод, либо обновляет его состояние. Если он обновляет свое состояние, то он отправляет обновление в выходные части представления. Таким образом, для проверки в качестве примера, вы можете сделать одну из двух вещей:

  • Когда пользователь нажимает кнопку "отправить", представлению модели передается электронное письмо и пароль. Он заботится о том, что делать, и меняет свое состояние в зависимости от значений этих строк. Затем он уведомляет контроллер представления о том, что его состояние изменилось.

  • Когда пользователь вводит данные в каждое текстовое поле, возможно, даже для каждого отдельного символа, модели представления передаются текущие значения текстового поля. Он заботится о том, что делать, и меняет свое состояние в зависимости от значений этих строк. Затем он уведомляет контроллер представления о том, что его состояние изменилось.

  • Должен отобразиться запрос на проверку виртуальной машины, а затем запрос на выполнение процесса входа в систему или
  • Должно ли представление просто передать действие щелчка ВМ со значениями электронной почты / пароля, и ВМ решает, следует ли выполнить проверку или нет, и что делать, если она прошла или не прошла?

Последний. Идея состоит в том, чтобы переместить как можно больше работы из контроллера представления, чтобы его было легче контролировать / тестировать.

Другие вопросы по тегам