私はUIControlのカスタムサブクラスを作成しています(私は描画メソッドをオーバーライドする必要があります)。isSelectedプロパティをモデルにバインドするためにRxSwiftを追加します。カスタムUIControlサブクラスとRxSwift
これまでのところとても良いです。これは正常に動作します。
私の問題は、ユーザーtouchUpInsideイベントに応じてisSelectedプロパティを変更する方法です。
私の最初の試みは、UicontrolののaddTargetメソッドを使用していたが、isSelectedの値を変更すると、プログラムControlProperty(DOCに記載されているように)によって報告されていません。しかし、私はこれを解決する別の方法を考え出すことができます。
助けてください。サブクラスの
ソースコード:
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