如何使用 RxSwift 監聽 UIButton 的 isHighlighted / isEnable 事件

如果我們要連動兩個按鈕的 isHighlighted 事件,我們可以用 RxSwift 來監聽,而這個發想點很簡單,就是我們去聽 UIButton 的 controlEvent,之後再將 isHighlighted 轉成 Observable 再來訂閱就可以了。

swift 1

舉例來說,我們有兩個 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)
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments