Ух ты, в этот вопрос упаковано много вопросов ... Посмотрим, что я могу дразнить:
Как должно отображаться это начальное состояние просмотра, когда может быть много компонентов пользовательского интерфейсав виде?
Когда не используется реактивная система, будь то в 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 проверить, а затем попросить выполнить процесс входа в систему или
- Должно ли представление просто передать действие щелчка ВМ со значениями электронной почты / пароля, и ВМ решает, следует ли выполнить проверку или нет, и что делать, если она прошла или не прошла?
Последнее.Идея состоит в том, чтобы переместить как можно больше работы из контроллера представления, чтобы его было легче контролировать / тестировать.