diff --git a/RxCocoa/iOS/UITextView+Rx.swift b/RxCocoa/iOS/UITextView+Rx.swift index aa474cb0..0db527af 100644 --- a/RxCocoa/iOS/UITextView+Rx.swift +++ b/RxCocoa/iOS/UITextView+Rx.swift @@ -65,7 +65,47 @@ extension Reactive where Base: UITextView { return ControlProperty(values: source, valueSink: bindingObserver) } - + + /** + Reactive wrapper for `delegate` message. + */ + public var rx_didBeginEditing: ControlEvent<()> { + return ControlEvent<()>(events: self.rx_delegate.observe(#selector(UITextViewDelegate.textViewDidBeginEditing(_:))) + .map { a in + return () + }) + } + + /** + Reactive wrapper for `delegate` message. + */ + public var rx_didEndEditing: ControlEvent<()> { + return ControlEvent<()>(events: self.rx_delegate.observe(#selector(UITextViewDelegate.textViewDidEndEditing(_:))) + .map { a in + return () + }) + } + + /** + Reactive wrapper for `delegate` message. + */ + public var rx_didChange: ControlEvent<()> { + return ControlEvent<()>(events: self.rx_delegate.observe(#selector(UITextViewDelegate.textViewDidChange(_:))) + .map { a in + return () + }) + } + + /** + Reactive wrapper for `delegate` message. + */ + public var rx_didChangeSelection: ControlEvent<()> { + return ControlEvent<()>(events: self.rx_delegate.observe(#selector(UITextViewDelegate.textViewDidChangeSelection(_:))) + .map { a in + return () + }) + } + } #endif diff --git a/Tests/RxCocoaTests/UITextView+RxTests.swift b/Tests/RxCocoaTests/UITextView+RxTests.swift index 938e1134..72fa6113 100644 --- a/Tests/RxCocoaTests/UITextView+RxTests.swift +++ b/Tests/RxCocoaTests/UITextView+RxTests.swift @@ -28,6 +28,86 @@ class UITextViewTests : RxTest { textView.rx.text.on(.next("Text2")) XCTAssertTrue(textView.set) } + + func testDidBeginEditing() { + var completed = false + var value: ()? + + autoreleasepool { + let textView = UITextView(frame: CGRectMake(0, 0, 1, 1)) + + _ = textView.rx_didBeginEditing.subscribe(onNext: { n in + value = n + }, onCompleted: { + completed = true + }) + + textView.delegate!.textViewDidBeginEditing!(textView) + } + + XCTAssertNotNil(value) + XCTAssertTrue(completed) + } + + func testDidEndEditing() { + var completed = false + var value: ()? + + autoreleasepool { + let textView = UITextView(frame: CGRectMake(0, 0, 1, 1)) + + _ = textView.rx_didEndEditing.subscribe(onNext: { n in + value = n + }, onCompleted: { + completed = true + }) + + textView.delegate!.textViewDidEndEditing!(textView) + } + + XCTAssertNotNil(value) + XCTAssertTrue(completed) + } + + func testDidChange() { + var completed = false + var value: ()? + + autoreleasepool { + let textView = UITextView(frame: CGRectMake(0, 0, 1, 1)) + + _ = textView.rx_didChange.subscribe(onNext: { n in + value = n + }, onCompleted: { + completed = true + }) + + textView.delegate!.textViewDidChange!(textView) + } + + XCTAssertNotNil(value) + XCTAssertTrue(completed) + } + + func testDidChangeSelection() { + var completed = false + var value: ()? + + autoreleasepool { + let textView = UITextView(frame: CGRectMake(0, 0, 1, 1)) + + _ = textView.rx_didChangeSelection.subscribe(onNext: { n in + value = n + }, onCompleted: { + completed = true + }) + + textView.delegate!.textViewDidChangeSelection!(textView) + } + + XCTAssertNotNil(value) + XCTAssertTrue(completed) + } } class UITextViewSubclass2 : UITextView {