Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to select CollectionView cell in RxSwift

I need to select the item at specific index in collection view using RxSwift.This method is not working fine.

 collectionView.rx.modelSelected(SearchResult.self).subscribe(onNext:{ menuItem in }).addDisposableTo(disposeBag) 

Can anybody help?

like image 342
Mehreen Avatar asked Apr 10 '17 12:04

Mehreen


2 Answers

If you want the indexPath of item selected you can use the following :

collectionView
    .rx
    .itemSelected
        .subscribe(onNext:{ indexPath in
            //your code
        }).disposed(by: disposeBag)

and if you want to the model being selected :

collectionView
        .rx
        .modelSelected(SearchResult.self)
        .subscribe(onNext: { (model) in
            //Your code
        }).disposed(by: disposeBag)

And you can combine the above, to get the modelSelected with their indexPath as follow:

  Observable
            .zip(
                collectionView
                    .rx
                    .itemSelected
                ,collectionView
                    .rx
                    .modelSelected(SearchResult.self)
            )
            .bind{ [unowned self] indexPath, model in

            }
            .disposed(by: disposeBag)
    }
like image 159
mojtaba al moussawi Avatar answered Nov 12 '22 04:11

mojtaba al moussawi


Building off of mojtaba al moussawi's answer, I made an extension to make the zipping easy:

extension Reactive where Base: UICollectionView {
    public func modelAndIndexSelected<T>(_ modelType: T.Type) -> ControlEvent<(T, IndexPath)> {
        ControlEvent(events: Observable.zip(
            self.modelSelected(modelType),
            self.itemSelected
        ))
    }
}

Which you would use like:

collectionView
    .rx
    .modelAndIndexSelected(SearchResult.self)
    .subscribe(onNext: { (model, index) in
        //Your code
    }).disposed(by: disposeBag)
like image 3
Greg Avatar answered Nov 12 '22 05:11

Greg