Merge pull request #394 from yannickl/develop

[ADD] rx_itemDeselected and rx_modelDeselected events
This commit is contained in:
Krunoslav Zaher 2016-01-07 21:23:29 +01:00
commit 444d4c8611
2 changed files with 46 additions and 2 deletions

View File

@ -135,7 +135,19 @@ extension UITableView {
return ControlEvent(events: source)
}
/**
Reactive wrapper for `delegate` message `tableView:didDeselectRowAtIndexPath:`.
*/
public var rx_itemDeselected: ControlEvent<NSIndexPath> {
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<T>(modelType: T.Type) -> ControlEvent<T> {
let source: Observable<T> = rx_itemSelected.flatMap { [weak self] indexPath -> Observable<T> 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<T>() -> ControlEvent<T> {
let source: Observable<T> = 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<T>(modelType: T.Type) -> ControlEvent<T> {
let source: Observable<T> = rx_itemDeselected.flatMap { [weak self] indexPath -> Observable<T> 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

View File

@ -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() {