ios ViewModel с ReactiveCocoa v3 и Swift 1.2
У меня возникают проблемы с использованием ReactiveCocoa в версии 3. Я хочу построить некоторую модель представления для моего контроллера представления входа в систему. На мой взгляд контроллер у меня есть выход для текстового поля пароля:
@IBOutlet weak var passwordTextField: UITextField!
В модели представления у меня есть свойство для текста, который является паролем
public let emailText = MutableProperty<String>("")
и вопрос в том, как связать это вместе? Я могу получить SignalProducer из текстового поля:
emailTextField.rac_textSignal().toSignalProducer()
но как привязать его к свойству emailText? Я прочитал в документации, что SignalProducer не является сигналом, но он может создавать сейчас. Есть метод start(), но он принимает Sink в качестве параметра, и я немного запутался с дизайном в данный момент. Разве emailText не должен быть Мойкой?
1 ответ
Примечание: это не совсем правильный ответ на ваш вопрос, но я думаю, что это может вам помочь.
Если вы просто хотите связать свой вид с моделью представления, я предлагаю вам прочитать этот пост, который предоставляет решение проблемы в одном классе.
Оттуда вы можете очень просто реализовать двухстороннее связывание, чтобы ваша модель представления обновлялась каждый раз, когда изменяется представление, и наоборот. Вот мое расширение:
class TwoWayDynamic<T> {
typealias Listener = T -> Void
private var viewListener: Listener?
private var controllerListener: Listener?
private(set) var value: T
func setValueFromController(value: T) {
self.value = value
viewListener?(value)
}
func setValueFromView(value: T) {
self.value = value
controllerListener?(value)
}
func setValue(value: T) {
self.value = value
controllerListener?(value)
viewListener?(value)
}
init(_ v: T) {
value = v
}
func bindView(listener: Listener?) {
self.viewListener = listener
}
func bindController(listener: Listener?) {
self.controllerListener = listener
}
func bindViewAndFire(listener: Listener?) {
self.viewListener = listener
listener?(value)
}
func bindControllerAndFire(listener: Listener?) {
self.controllerListener = listener
listener?(value)
}
}
Надеюсь, поможет!