[英]How do I trigger action for rx.tap.bind of UIButton?
我只是有這樣的事情:
class CheckboxView: UIView {
private let button = UIButton()
var rxaction: RxSwift.Reactive<UIButton> {
button.rx
}
}
let view = CheckboxView()
view.rxaction.tap.bind { in
print(sth)
}.disposed(by: disposeBag)
如何使用rxaction
手動執行操作來調用綁定閉包?
函數式反應式編程的本質是在聲明時完全指定值的動態行為。 —— 海因里希·阿普菲爾姆斯
因此,如果想要手動執行操作,您就沒有正確使用 FRP。 也就是說,向 FRP 思維方式的轉變可能很艱難。
當您想在命令式庄園中處理 Observable 時,您需要一個 Subject。 在您的情況下,目標是在點擊按鈕或命令時發出事件。 所以你這樣做:
class CheckboxView: UIView {
private let button = UIButton()
private let _manualAction = PublishSubject<Void>()
let tap: Observable<Void>
override init(frame: CGRect) {
tap = Observable.merge(
button.rx.tap.asObservable(),
_manualAction
)
super.init(frame: frame)
}
required init?(coder: NSCoder) {
tap = Observable.merge(
button.rx.tap.asObservable(),
_manualAction
)
super.init(coder: coder)
}
deinit {
_manualAction.onCompleted()
}
func actManually() {
_manualAction.onNext(())
}
}
請注意, tap
是let
而不是var
這是因為如果您將其設置為var
它可能會被替換,這不會取消任何訂閱者。 他們會繼續指向前一個對象並強迫它保持活動狀態。
另請注意,我沒有使用計算屬性。 那是因為這樣做會在每次調用tap
創建一個不同的 Observable。 一般來說,這不是你想要的,所以你應該養成避免它的習慣。 (在這種特殊情況下,結果是一個熱 Observable,所以這樣做是可以的,但如果你經常這樣做,你會在很多時候出錯。)
最后,您可能想知道為什么您必須通過所有這些來手動觸發訂閱。 再次記住,手動觸發違背了 FRP 的本質。 你應該避免它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.