[RxSwift] Custom ControlEvent

RudinP·2025년 11월 18일
0

Study

목록 보기
378/380

controlEvent

    /// - parameter controlEvents: Filter for observed event types.
    public func controlEvent(_ controlEvents: UIControl.Event) -> ControlEvent<()> {
        let source: Observable<Void> = Observable.create { [weak control = self.base] observer in
                MainScheduler.ensureRunningOnMainThread()

                guard let control = control else {
                    observer.on(.completed)
                    return Disposables.create()
                }

                let controlTarget = ControlTarget(control: control, controlEvents: controlEvents) { _ in
                    observer.on(.next(()))
                }

                return Disposables.create(with: controlTarget.dispose)
            }
            .take(until: deallocated)

        return ControlEvent(events: source)
    }
  • controlProperty와 달리 방출형식은 void로 고정

커스텀 구현

  • Reactive extension
  • controlEvent를 리턴하면 됨
//extension CustomControlEventViewController: UITextFieldDelegate {
//    func textFieldDidBeginEditing(_ textField: UITextField) {
//        textField.layer.borderColor = UIColor.red.cgColor
//    }
//    
//    func textFieldDidEndEditing(_ textField: UITextField) {
//        textField.layer.borderColor = UIColor.gray.cgColor
//    }
//}

extension Reactive where Base: UITextField {
    var borderColor: Binder<UIColor?> {
        return Binder(self.base) { textField, color in
            textField.layer.borderColor = color?.cgColor
        }
    }
    
    var editingDidBegin: ControlEvent<Void> {
        return controlEvent(.editingDidBegin)
    }
    
    var editingDidEnd: ControlEvent<Void> {
        return controlEvent(.editingDidEnd)
    }
}
//~viewDidLoad
        inputField.rx.editingDidBegin
            .map { UIColor.red }
            .bind(to: inputField.rx.borderColor)
            .disposed(by: bag)
        
        inputField.rx.editingDidEnd
            .map { UIColor.gray }
            .bind(to: inputField.rx.borderColor)
            .disposed(by: bag)
profile
iOS 개발자가 되기 위한 스터디룸/스터디의 레퍼런스는 모두 kxcoding

0개의 댓글