ReactiveSwift:如何观察 UIView isHidden?

ReactiveSwift: How to observe UIView isHidden?

我想显示 B UIView iff A UIView 可见。我在objective-c中使用了ReactiveCocoa 2,并试图在ReactiveSwift中找到类似的方法来观察UIView的isHidden 属性。我仍在尝试学习框架及其用法,但无法想出一个好的解决方案。如果有人能给我建议,我将不胜感激。

这是来自 ReactiveSwift readme 的 KVO 示例:

// A producer that sends the current value of `keyPath`, followed by
// subsequent changes.
//
// Terminate the KVO observation if the lifetime of `self` ends.
let producer = object.reactive.values(forKeyPath: #keyPath(key))
    .take(during: self.reactive.lifetime)

所以在你的情况下你可以做这样的事情(还没有真正尝试过这段代码,但它应该传达了这个想法):

viewA.reactive.values(forKeyPath: #keyPath(isHidden))
    .take(during: self.reactive.lifetime)
    .startWithValues { hidden in viewB.isHidden = hidden }

更新:

刚刚注意到ReactiveCocoa includes a binding target for UIView`s isHidden property,所以你其实可以把上面的代码简化为:

viewB.reactive.isHidden <~ viewA.reactive.values(forKeyPath: #keyPath(isHidden))

请注意,使用 <~ 时不再需要 take(during:),因为 <~ 自动将绑定源的处置与绑定目标的生命周期联系起来。