如何触发 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 手动执行操作以调用绑定闭包?

The essence of functional reactive programming is to specify the dynamic behavior of a value completely at the time of declaration. -- Heinrich Apfelmus

因此,如果您想要手动执行某项操作,则说明您没有正确使用 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 它可能会被替换 not 取消任何订阅者。他们会继续指向之前的物体并强迫它存活。

另请注意,我没有使用计算 属性。这是因为这样做会在每次调用 tap 时创建一个不同的 Observable。一般来说,这不是你想要的,所以你应该养成避免它的习惯。 (在这种特殊情况下,结果是一个热 Observable,所以可以这样做,但如果你经常这样做,很多时候你会出错。)

最后,您可能想知道为什么您必须经历所有这些才能手动触发订阅。再次提醒,手动触发违背了 FRP 的本质。你应该避免它。