0

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

@IBOutlet weak var passwordTextField: UITextField!

在视图模型中,我有作为密码的文本的属性

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

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

emailTextField.rac_textSignal().toSignalProducer()

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

4

1 回答 1

0

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

如果您只是想将您的视图绑定到您的视图模型,我建议您阅读这篇文章,它为该问题提供了一个一流的解决方案。

从那里,您可以非常简单地实现 2-way 绑定,这样您的视图模型就会在每次视图更改时更新,反之亦然。这是我的扩展:

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

希望能帮助到你!

于 2015-08-30T10:23:26.753 回答