如何触发 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(())
}
}
请注意 tap
是 let
而不是 var
这是因为如果您将其设为 var
它可能会被替换 not 取消任何订阅者。他们会继续指向之前的物体并强迫它存活。
另请注意,我没有使用计算 属性。这是因为这样做会在每次调用 tap
时创建一个不同的 Observable。一般来说,这不是你想要的,所以你应该养成避免它的习惯。 (在这种特殊情况下,结果是一个热 Observable,所以可以这样做,但如果你经常这样做,很多时候你会出错。)
最后,您可能想知道为什么您必须经历所有这些才能手动触发订阅。再次提醒,手动触发违背了 FRP 的本质。你应该避免它。
我只是有这样的东西:
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(())
}
}
请注意 tap
是 let
而不是 var
这是因为如果您将其设为 var
它可能会被替换 not 取消任何订阅者。他们会继续指向之前的物体并强迫它存活。
另请注意,我没有使用计算 属性。这是因为这样做会在每次调用 tap
时创建一个不同的 Observable。一般来说,这不是你想要的,所以你应该养成避免它的习惯。 (在这种特殊情况下,结果是一个热 Observable,所以可以这样做,但如果你经常这样做,很多时候你会出错。)
最后,您可能想知道为什么您必须经历所有这些才能手动触发订阅。再次提醒,手动触发违背了 FRP 的本质。你应该避免它。