我正在创建UIControl的自定义子类(我需要重写它的绘制方法),我想添加RxSwift以将其isSelected属性绑定到我的模型。RxSwift自定义UIControl子类
到目前为止这么好。这工作正常。
我的问题是我怎样才能改变值isSelected财产响应用户touchUpInside事件?
我的第一次尝试是使用UIControl的addTarget方法,但改变程序不被ControlProperty报道(如文档规定)的isSelected的价值。但我可以想出另一种解决方法。
任何帮助表示赞赏。子类的
的源代码:
class SYYesNoButton: UIControl {
override init(frame: CGRect) {
super.init(frame: frame)
// subscribe to touchUpInside event
addTarget(
self,
action: #selector(userDidTouchUpInside),
for: UIControlEvents.touchUpInside)
}
func userDidTouchUpInside() {
// change the value of the property
// this does not work,
// the change is not reported to the ControlProperty
// HOW CAN I CHANGE THIS ??
self.isSelected = !isSelected
}
}
扩展增加无功支持:
extension SYYesNoButton {
var rx_isSelected: ControlProperty<Bool> {
return UIControl.valuePublic(
self,
getter: { (button) -> Bool in
return button.isSelected
},
setter: { (button, value) in
button.isSelected = value
})
}
}
extension UIControl {
static func valuePublic<T, ControlType: UIControl>(_ control: ControlType, getter: @escaping (ControlType) -> T, setter: @escaping (ControlType, T) ->()) -> ControlProperty<T> {
let values: Observable<T> = Observable.deferred { [weak control] in
guard let existingSelf = control else {
return Observable.empty()
}
return (existingSelf as UIControl).rx.controlEvent([.allEditingEvents, .valueChanged])
.flatMap { _ in
return control.map { Observable.just(getter($0)) } ?? Observable.empty()
}
.startWith(getter(existingSelf))
}
return ControlProperty(values: values, valueSink: UIBindingObserver(UIElement: control) { control, value in
setter(control, value)
})
}
}
感谢所有。
你是不是也使用'RxCocoa'? – ozgur
我也使用RxCocoa – t4ncr3d3