diff --git a/CHANGELOG.md b/CHANGELOG.md index a573f09f..909dbe1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ All notable changes to this project will be documented in this file. * Adds `ignoreElements` operator. +* Adds `rx_attributedText` to `UILabel`. --- diff --git a/RxCocoa/iOS/UILabel+Rx.swift b/RxCocoa/iOS/UILabel+Rx.swift index ea82bef9..fdab2069 100644 --- a/RxCocoa/iOS/UILabel+Rx.swift +++ b/RxCocoa/iOS/UILabel+Rx.swift @@ -34,6 +34,25 @@ extension UILabel { } } } + + /** + Bindable sink for `attributedText` property. + */ + public var rx_attributedText: AnyObserver { + return AnyObserver { [weak self] event in + MainScheduler.ensureExecutingOnScheduler() + + switch event { + case .Next(let value): + self?.attributedText = value + case .Error(let error): + bindingErrorToInterface(error) + break + case .Completed: + break + } + } + } } diff --git a/RxTests/RxCocoaTests/Control+RxTests+UIKit.swift b/RxTests/RxCocoaTests/Control+RxTests+UIKit.swift index e7e963ec..59061274 100644 --- a/RxTests/RxCocoaTests/Control+RxTests+UIKit.swift +++ b/RxTests/RxCocoaTests/Control+RxTests+UIKit.swift @@ -154,6 +154,22 @@ extension ControlTests { } } +// UILabel +extension ControlTests { + func testLabel_HasWeakReference() { + ensureControlObserverHasWeakReference(UILabel(), { (label: UILabel) -> AnyObserver in label.rx_attributedText }, { Variable(nil).asObservable() }) + } + + func testLabel_NextElementsSetsValue() { + let subject = UILabel() + let attributedTextSequence = Variable(nil) + + attributedTextSequence.subscribe(subject.rx_attributedText) + + attributedTextSequence.value = NSAttributedString(string: "Hello!") + XCTAssert(subject.attributedText == attributedTextSequence.value, "Expected attributedText to have been set") + } +} // UITableView extension ControlTests { diff --git a/RxTests/RxCocoaTests/Control+RxTests.swift b/RxTests/RxCocoaTests/Control+RxTests.swift index 5bde2612..33988d84 100644 --- a/RxTests/RxCocoaTests/Control+RxTests.swift +++ b/RxTests/RxCocoaTests/Control+RxTests.swift @@ -78,4 +78,24 @@ class ControlTests : RxTest { XCTAssertTrue(deallocated) XCTAssertTrue(completed) } + + func ensureControlObserverHasWeakReference(@autoclosure createControl: () -> (C), _ observerSelector: C -> AnyObserver, _ observableSelector: () -> (Observable)) { + var deallocated = false + + let disposeBag = DisposeBag() + + autoreleasepool { + let control = createControl() + let propertyObserver = observerSelector(control) + let observable = observableSelector() + + observable.bindTo(propertyObserver).addDisposableTo(disposeBag) + + _ = control.rx_deallocated.subscribeNext { _ in + deallocated = true + } + } + + XCTAssertTrue(deallocated) + } }