如何使用RxSwift订阅UIButton isSelected更改?

时间:2019-01-15 12:09:42

标签: ios swift rx-swift

当按钮更改其“ isSelected”状态时,我试图接收通知。 我有一个UIButton设置,目标是更改他的isSelected

let button = UIButton()
button.addTarget(button, action: #selector(toggleSelected), for: .touchUpInside)
....
@objc func toggleSelected() {
    self.isSelected = !self.isSelected
}

并且我希望拥有button.rx.isSelectedChanged之类的东西才能订阅事件。

我试图用ControlProperty扩展UIButton.rx:

extension Reactive where Base: UIButton {

    public var isSelectedChanged: ControlProperty<Bool> {
        return base.rx.controlProperty(
            editingEvents:  [.allEditingEvents, .valueChanged],
            getter: { $0.isSelected },
            setter: { $0.isSelected = $1 })
    }

}

和类似的东西

button.rx.observe(Bool.self, "isSelected")
    .takeUntil(button.rx.deallocated)
    .subscribe(onNext: { print("selcted \($0)") })

但是我都没有button.isSelected更新。

执行此操作的好方法是什么?

编辑: 在@ daniel-t回复之后,我实现了here

1 个答案:

答案 0 :(得分:1)

没有一种做自己想要的事的好方法,坦率地说,尝试是错误的。出于某些原因,可以通过编程方式更改按钮的所选状态。不要尝试将模型状态存储在UI中,而应该让UI反映模型状态。

查看任何调用toggleSelected()的内容。可以将其转换为rx,而您可以订阅它。