基于 Observable 值处理按钮触摸
Handling button touch based on the Observable value
我想知道基于 Observable
处理按钮点击的最佳做法是什么。我有枚举:
enum ButtonState {
case idle, valid, nonValid
}
和 Observable
结合了两个 Observables:
var buttonStateObservable: Observable<ButtonState> {
return Observable.combineLatest(isAddingVariable.asObservable(), addItemName.asObservable(),
resultSelector: { isAdding, itemName in
if isAdding {
return !itemName.isEmpty ? .valid : .nonValid
}
return .idle
})
}
在我的 ViewController 中,我订阅了这个 observable 并更新了 UIButton
的 UI。我想处理点击此按钮并根据此可观察对象执行某些操作。什么是最好的方法?
RxSwift
已经有 ControlEvent
包装了 UIButton
的 TouchUpInside
事件。您可以通过 .rx.tap
:
访问它
button.rx.tap.subscribe(onNext: {
self.button.setTitle("\(arc4random_uniform(100))", for: .normal)
self.button.layer.borderColor = UIColor.random.cgColor // or your special color
})
.disposed(by: bag)
点击 3 次的结果:
UPD.
您可以通过.withLatestFrom()
检查其他可观察值。改进的顶部示例:
let subject = BehaviorSubject<Bool>(value: true)
button.rx.tap.asDriver()
.withLatestFrom(subject.asDriver(onErrorJustReturn: false))
.drive(onNext: { value in
if value {
self.button.setTitle("\(arc4random_uniform(100))", for: .normal)
self.button.layer.borderColor = UIColor.random().cgColor
}
subject.onNext(!value)
})
.disposed(by: bag)
因此,在您的情况下,您可以将 Observable.combineLatest(...)
放入 .withLatestFrom
并使用这些值执行逻辑。
我想知道基于 Observable
处理按钮点击的最佳做法是什么。我有枚举:
enum ButtonState {
case idle, valid, nonValid
}
和 Observable
结合了两个 Observables:
var buttonStateObservable: Observable<ButtonState> {
return Observable.combineLatest(isAddingVariable.asObservable(), addItemName.asObservable(),
resultSelector: { isAdding, itemName in
if isAdding {
return !itemName.isEmpty ? .valid : .nonValid
}
return .idle
})
}
在我的 ViewController 中,我订阅了这个 observable 并更新了 UIButton
的 UI。我想处理点击此按钮并根据此可观察对象执行某些操作。什么是最好的方法?
RxSwift
已经有 ControlEvent
包装了 UIButton
的 TouchUpInside
事件。您可以通过 .rx.tap
:
button.rx.tap.subscribe(onNext: {
self.button.setTitle("\(arc4random_uniform(100))", for: .normal)
self.button.layer.borderColor = UIColor.random.cgColor // or your special color
})
.disposed(by: bag)
点击 3 次的结果:
UPD.
您可以通过.withLatestFrom()
检查其他可观察值。改进的顶部示例:
let subject = BehaviorSubject<Bool>(value: true)
button.rx.tap.asDriver()
.withLatestFrom(subject.asDriver(onErrorJustReturn: false))
.drive(onNext: { value in
if value {
self.button.setTitle("\(arc4random_uniform(100))", for: .normal)
self.button.layer.borderColor = UIColor.random().cgColor
}
subject.onNext(!value)
})
.disposed(by: bag)
因此,在您的情况下,您可以将 Observable.combineLatest(...)
放入 .withLatestFrom
并使用这些值执行逻辑。