gpt4 book ai didi

swift - 基于 Observable 值处理按钮触摸

转载 作者:行者123 更新时间:2023-11-28 12:04:28 25 4
gpt4 key购买 nike

我想知道基于 Observable 处理按钮点击的最佳实践是什么。我有枚举:

enum ButtonState {
case idle, valid, nonValid
}

Observable 结合了两个 Observable:

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 包装了 UIButtonTouchUpInside 事件。您可以通过 .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 次的结果:

enter image description here


UPD。

您可以通过 .withLatestFrom() 检查其他 observable。改进的顶级示例:

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 并使用这些值执行逻辑。

关于swift - 基于 Observable 值处理按钮触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49652987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com