如何触发UIButton的rx.tap.bind操作



我有这样的东西:

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

函数式反应式编程的本质是在声明时完全指定值的动态行为。--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,它可能会被替换,这将不会取代任何订阅者。他们会继续指向前一个物体,并迫使它活着。

还要注意,我没有使用计算属性。这是因为这样做会在每次调用tap时创建一个不同的Observable。一般来说,这不是你想要的,所以你应该养成避免它的习惯

最后,你可能想知道为什么你必须经历这一切才能手动触发订阅。再次记住,手动触发器违背了FRP的本质。你应该避免。

最新更新