Двойное отображение RxSwift в tableView.rx.itemSelected
Я хочу получить объект от tableView.rx.itemSelected
и после обработки. Этот метод возврата IndexPath
так что я могу отобразить это значение. Но как получить объект по индексу из ViewModel
?
struct ViewModel {
var items: Observable<[Item]>
}
Приблизительно я ожидаю что-то вроде этого (но этот поток не так):
tableView.rx.itemSelected
.map { indexPath -> Item in
return viewModel.items.map {$0[indexPath.row]}
}
..subscribe(onNext: { [unowned self] item in
//other actions with Item object
})
.disposed(by: disposeBag)
Я где-то показывал эту возможность, но не могу вспомнить. У вас есть идея, как это сделать?
2 ответа
Если вам нужны оба indexPath
и model
Вы можете объединить 2 метода и преобразовать их только в одну наблюдаемую последовательность:
Observable
.zip(tableView.rx.itemSelected, tableView.rx.modelSelected(String.self))
.bind { [unowned self] indexPath, model in
self.tableView.deselectRow(at: indexPath, animated: true)
print("Selected " + model + " at \(indexPath)")
}
.disposed(by: disposeBag)
RxCocoa имеет 2 метода:
public var itemSelected: ControlEvent<IndexPath> { get }
который возвращается IndexPath
выбранного элемента
а также public func modelSelected<T>(_ modelType: T.Type) -> ControlEvent<T>
который возвращает элемент модели
В соответствии с вашим примером это будет выглядеть так:
tableView.rx.modelSelected(Item.self)
.subscribe(onNext: { [weak self] item in
// other actions with Item object
}).addDisposableTo(disposeBag)
Также я нашел другой способ добавить do(onNext:{...})
после itemSelected
команда:
tableView.rx
.itemSelected
.do(onNext: { [unowned self] indexPath in
self.tableView.deselectRow(at: indexPath, animated: false)
})
.map { indexPath -> Item in
return viewModel.items.map {$0[indexPath.row]}
}
.subscribe(self.viewModel.reviewTimeAction.inputs)
.disposed(by: disposeBag)