如果我們要連動兩個按鈕的 isHighlighted 事件,我們可以用 RxSwift 來監聽,而這個發想點很簡單,就是我們去聽 UIButton 的 controlEvent,之後再將 isHighlighted 轉成 Observable 再來訂閱就可以了。
舉例來說,我們有兩個 button,我們可以用這樣的方式來監聽 isHighlighted
let a: UIButton = UIButton()
let b: UIButton = UIButton()
a.rx.controlEvent(.allEvents)
.map { [unowned self] _ in a.isHighlighted }
.subscribe(onNext: {[unowned self] isHighlighted in
b.isHighlighted = isHighlighted
}).disposed(by: disposeBag)
或者,你可以寫成 Rxswift 的擴充
extension Reactive where Base: UIButton {
var isHighlighted: Observable<Bool> {
let anyObservable = base.rx.methodInvoked(#selector(setter: base.isHighlighted))
let boolObservable = anyObservable
.flatMap { Observable.from(optional: $0.first as? Bool) }
.startWith(base.isHighlighted)
.distinctUntilChanged()
.share()
return boolObservable
}
}
用法 如下∶
a.rx.isHighlighted.subscribe(onNext: {[unowned self] isHighlighted in
b.isHighlighted = isHighlighted
}).disposed(by: disposeBag)
如果你要監聽按鈕是否可用,也可以這樣寫。
extension Reactive where Base: UIButton {
var isEnabled: Observable<Bool> {
let anyObservable = base.rx.methodInvoked(#selector(setter: base.isEnabled))
let boolObservable = anyObservable
.flatMap { Observable.from(optional: $0.first as? Bool) }
.startWith(base.isEnabled)
.distinctUntilChanged()
.share()
return boolObservable
}
}
用法 如下∶
a.rx.isEnabled.subscribe(onNext: {[unowned self] isEnabled in
b.isEnabled = isEnabled
}).disposed(by: disposeBag)