ios - 如何将 Signal<Bool, NoError> 绑定(bind)到 Reactive Cocoa 4 中 UIButton 的启用属性

标签 ios swift reactive-cocoa

我有一个非常简单的用例 ReactiveCocoa .在我的设置中,我有两个 UITextField s和一个UIButton .

按钮的 enabled属性应仅设置为 true当且仅当两个文本字段都包含至少一个字符。

我开始创建一个 Signal<Bool, NoError>发出 truefalse取决于上述条件。

现在,据我所知,我需要以某种方式将信号(或其值)绑定(bind)enabled我的按钮的属性。但我不知道该怎么做,一个多小时的研究没有得出任何结果......

更新: 据我了解,这以前可以使用 RAC 来实现宏:RAC(self.button, enabled) = signal; , 或类似的规定。但这对我没有帮助,因为宏在 RAC 3 中已被弃用。我的问题基本上与 this one 相同。仅适用于 RAC 4 而不是 3。

最佳答案

这可以使用自定义 <~ 来实现运算符(operator)。但是,它仅适用于 MutableProperty 类型的属性, 所以我们不能只做以下事情:

let signal: <Bool, NoError> = ...
button.enabled <~ signal

相反,我们需要包装按钮的 enabled MutableProperty 中的属性(property)像这样:

extension UIButton {
    public var rac_enabled: MutableProperty<Bool> {
        return lazyMutableProperty(self, key: &AssociationKey.text, setter: { self.enabled = $0 }, getter: { self.enabled })
    }
}

请注意,此实现取决于此 gist这是由 Colin Eberhardt 创建的.

现在我们可以做:

button.rac_enabled <~ signal

关于ios - 如何将 Signal<Bool, NoError> 绑定(bind)到 Reactive Cocoa 4 中 UIButton 的启用属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34188400/

相关文章:

ios - iPhone中的OCR检测

ios - 当应用程序被另一个应用程序调用时,xcode iOS 删除启动画面

ios - 为什么在 iOS Swift 中扩展协议(protocol)时需要提供方法实现?

swift - SKSpriteNode 名称为 int

ios - 如何使用 remoteio 回调同步后台线程中环形缓冲区的填充

ios - 当选择单元格时,如何阻止 UIView 的背景颜色消失?

ios - 我可以用一个 Cocoapod 定位多个 Xcode/Swift 版本吗?

ios - 为什么这个连接不起作用?

ios - 如何从 rac_sequence、reactive cocoa、ios 获取项目

swift - 使用 Combine 合并先前的值