From f00effc9b53bce33dec0a5d42f46a11728f9ad30 Mon Sep 17 00:00:00 2001 From: Yannick Loriot Date: Thu, 7 Jan 2016 13:06:39 +0100 Subject: [PATCH 1/2] [ADD] rx_itemDeselected and rx_modelDeselected events --- RxCocoa/iOS/UITableView+Rx.swift | 46 ++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/RxCocoa/iOS/UITableView+Rx.swift b/RxCocoa/iOS/UITableView+Rx.swift index 66134491..c723198a 100644 --- a/RxCocoa/iOS/UITableView+Rx.swift +++ b/RxCocoa/iOS/UITableView+Rx.swift @@ -135,7 +135,19 @@ extension UITableView { return ControlEvent(events: source) } - + + /** + Reactive wrapper for `delegate` message `tableView:didDeselectRowAtIndexPath:`. + */ + public var rx_itemDeselected: ControlEvent { + let source = rx_delegate.observe("tableView:didDeselectRowAtIndexPath:") + .map { a in + return a[1] as! NSIndexPath + } + + return ControlEvent(events: source) + } + /** Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`. */ @@ -197,7 +209,6 @@ extension UITableView { return ControlEvent(source: source) } - */ public func rx_modelSelected(modelType: T.Type) -> ControlEvent { let source: Observable = rx_itemSelected.flatMap { [weak self] indexPath -> Observable in @@ -211,6 +222,37 @@ extension UITableView { return ControlEvent(events: source) } + /** + Reactive wrapper for `delegate` message `tableView:didDeselectRowAtIndexPath:`. + + It can be only used when one of the `rx_itemsWith*` methods is used to bind observable sequence. + + tableView.rx_modelSelected(MyModel.self) + .map { ... + + If custom data source is being bound, new `rx_modelSelected` wrapper needs to be written also. + + public func rx_myModelDeselected() -> ControlEvent { + let source: Observable = rx_itemDeselected.map { indexPath in + let dataSource: MyDataSource = self.rx_dataSource.forwardToDelegate() as! MyDataSource + + return dataSource.modelAtIndex(indexPath.item)! + } + + return ControlEvent(source: source) + } + */ + public func rx_modelDeselected(modelType: T.Type) -> ControlEvent { + let source: Observable = rx_itemDeselected.flatMap { [weak self] indexPath -> Observable in + guard let view = self else { + return Observable.empty() + } + + return Observable.just(try view.rx_modelAtIndexPath(indexPath)) + } + + return ControlEvent(events: source) + } /** Synchronous helper method for retrieving a model at indexPath through a reactive data source From e5978c796d3ff2d3c9a8c578c4a48189a171da47 Mon Sep 17 00:00:00 2001 From: Yannick Loriot Date: Thu, 7 Jan 2016 13:10:00 +0100 Subject: [PATCH 2/2] [UPDATE] Test case --- Tests/RxCocoaTests/Control+RxTests+UIKit.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tests/RxCocoaTests/Control+RxTests+UIKit.swift b/Tests/RxCocoaTests/Control+RxTests+UIKit.swift index eefc151c..e05632e2 100644 --- a/Tests/RxCocoaTests/Control+RxTests+UIKit.swift +++ b/Tests/RxCocoaTests/Control+RxTests+UIKit.swift @@ -193,11 +193,13 @@ extension ControlTests { let createView: () -> UITableView = { UITableView(frame: CGRectMake(0, 0, 1, 1)) } ensureEventDeallocated(createView) { (view: UITableView) in view.rx_itemSelected } + ensureEventDeallocated(createView) { (view: UITableView) in view.rx_itemDeselected } ensureEventDeallocated(createView) { (view: UITableView) in view.rx_modelSelected(Int.self) } ensureEventDeallocated(createView) { (view: UITableView) in view.rx_itemDeleted } ensureEventDeallocated(createView) { (view: UITableView) in view.rx_itemMoved } ensureEventDeallocated(createView) { (view: UITableView) in view.rx_itemInserted } ensureEventDeallocated(createView) { (view: UITableView) in view.rx_modelSelected(Int.self) } + ensureEventDeallocated(createView) { (view: UITableView) in view.rx_modelDeselected(Int.self) } } func testTableView_DelegateEventCompletesOnDealloc1() {