iOS MVVM обрабатывает начальное состояние просмотра - PullRequest
0 голосов
/ 21 сентября 2018

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 22 сентября 2018

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

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

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

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

Представление решает как визуализировать себя, 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)

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

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

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

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

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

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

...