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)
    }
}

Надеюсь, поможет!

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