쓰기만 가능한 속성은 Binder로, 읽기와 쓰기가 모두 가능해야 한다면 Control Property로 구현한다.
/// This is a separate method to better communicate to public consumers that
/// an `editingEvent` needs to fire for control property to be updated.
internal func controlPropertyWithDefaultEvents<T>(
editingEvents: UIControl.Event = [.allEditingEvents, .valueChanged],
getter: @escaping (Base) -> T,
setter: @escaping (Base, T) -> Void
) -> ControlProperty<T> {
return controlProperty(
editingEvents: editingEvents,
getter: getter,
setter: setter
)
}
controlPropertyWithDefaultEvents 호출extension Reactive where Base: UISlider {
var color: ControlProperty<UIColor?> {
return base.rx.controlProperty(editingEvents: .valueChanged, getter: {
(slider) in
UIColor(white: CGFloat(slider.value), alpha: 1.0)
}, setter: { slider, color in
var white = CGFloat(1)
color?.getWhite(&white, alpha: nil)
slider.value = Float(white)
})
}
}
class CustomControlPropertyViewController: UIViewController {
let bag = DisposeBag()
@IBOutlet weak var resetButton: UIBarButtonItem!
@IBOutlet weak var whiteSlider: UISlider!
override func viewDidLoad() {
super.viewDidLoad()
// whiteSlider.rx.value
// .map { UIColor(white: CGFloat($0), alpha: 1.0) }
// .bind(to: view.rx.backgroundColor)
// .disposed(by: bag)
//
// resetButton.rx.tap
// .map { Float(0.5) }
// .bind(to: whiteSlider.rx.value)
// .disposed(by: bag)
//
// resetButton.rx.tap
// .map { UIColor(white: 0.5, alpha: 1.0) }
// .bind(to: view.rx.backgroundColor)
// .disposed(by: bag)
whiteSlider.rx.color
.bind(to: view.rx.backgroundColor)
.disposed(by: bag)
resetButton.rx.tap
.map { _ in UIColor(white: 0.5, alpha: 1.0) }
.bind(to: whiteSlider.rx.color.asObserver(), view.rx.backgroundColor.asObserver())
.disposed(by: bag)
}
}
asObserver()은 명시적 타입 변환(컴파일 에러 방지)