带有ReactiveCocoa v3和Swift 1.2的ios ViewModel

时间:2015-08-30 08:00:44

标签: ios swift mvvm reactive-cocoa-3

我在版本3中使用ReactiveCocoa时遇到问题。我想为我的登录视图控制器构建一些视图模型。在我的视图控制器中,我有密码文本字段的出口:

@IBOutlet weak var passwordTextField: UITextField!

在视图模型中,我有文本属性,即密码

public let emailText = MutableProperty<String>("")

问题是如何将它绑定在一起?我能从文本字段中获取SignalProducer:

emailTextField.rac_textSignal().toSignalProducer()

但如何将其绑定到emailText属性?我已经在文档中读到SignalProducer 一个Signal,但它现在可以创建。方法start()但它以Sink为参数,此时我对设计有点困惑。不应该将emailText作为接收器吗?

1 个答案:

答案 0 :(得分:0)

注意:这不是您问题的正确答案,但我认为这可能会对您有所帮助。

如果您只是想将视图绑定到视图模型,我建议您阅读this post,它提供了解决问题的一流解决方案。

从那里,您可以非常简单地实现双向绑定,这样每次视图更改时您的viewmodel都会更新,反之亦然。这是我的扩展名:

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

希望它有所帮助!