簡體   English   中英

如何觸發 UIButton 的 rx.tap.bind 的動作?

[英]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(())
    }
}

請注意, taplet而不是var這是因為如果您將其設置為var它可能會被替換,這不會取消任何訂閱者。 他們會繼續指向前一個對象並強迫它保持活動狀態。

另請注意,我沒有使用計算屬性。 那是因為這樣做會在每次調用tap創建一個不同的 Observable。 一般來說,這不是你想要的,所以你應該養成避免它的習慣。 (在這種特殊情況下,結果是一個熱 Observable,所以這樣做是可以的,但如果你經常這樣做,你會在很多時候出錯。)

最后,您可能想知道為什么您必須通過所有這些來手動觸發訂閱。 再次記住,手動觸發違背了 FRP 的本質。 你應該避免它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM