How to select CollectionView cell in RxSwift

11,628

Solution 1

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)
    }

Solution 2

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)
Share:
11,628
Mehreen
Author by

Mehreen

Updated on June 06, 2022

Comments

  • Mehreen
    Mehreen about 2 years

    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?