RxSwift中点击CollectionView1无法更新CollectionView2的问题排查
问题原因与解决方案
我一眼就看出问题所在了——你在ClassTabCV里创建的pickupVC是个全新的PickUpViewController实例,和父视图ParentView_Controller中正在显示的studentsViewController根本不是同一个对象!
当你点击CollectionView1的cell时,调用的是这个看不见的新实例的getStudentsData2方法,父视图里的studentCells BehaviorRelay完全没收到更新通知,CollectionView2自然不会触发刷新。
解决方案:用闭包回调让子视图通知父视图更新
这种父子视图的交互,用闭包是最直接的方式,既不会创建多余实例,也能通过weak self避免循环引用问题。
第一步:修改ClassTabCV,添加回调闭包
class ClassTabCV: UIViewController, UICollectionViewDelegateFlowLayout { let classCells = BehaviorRelay<[ClassModel]>(value: []) // 新增闭包,用于通知父视图选中的班级ID var onClassSelected: ((Int) -> Void)? private let disposeBag = DisposeBag() // 补上你之前漏掉的disposeBag! override func viewDidLoad() { super.viewDidLoad() classTab.rx.setDelegate(self).disposed(by: disposeBag) setupBinding() } func setupBinding() { classTab.register(UINib(nibName: "ClassTabCVCell", bundle: nil), forCellWithReuseIdentifier: "classTabCV") // Cell绑定逻辑保持不变 classCells.asObservable().debug("Class View: ").bind(to: classTab.rx.items(cellIdentifier: "classTabCV", cellType: ClassTabCVCell.self)) {[weak self] (row , element, cell) in cell.viewModel = element }.disposed(by: disposeBag) // 修改cell点击逻辑,调用闭包通知父视图 Observable .zip( classTab.rx.itemSelected, classTab.rx.modelSelected(ClassModel.self)) .bind { [weak self] indexPath, model in // 把选中的班级ID传给父视图 self?.onClassSelected?(model.classId) }.disposed(by: disposeBag) } }
第二步:在父视图ParentView_Controller中设置闭包
class ParentView_Controller: UIViewController { // ... 其他原有代码不变 func bindViewModel() { // 原有的绑定逻辑保持不变 self.studentCell .asObservable() .debug("BIND: ") .observeOn(MainScheduler.instance) .bind(to: studentsViewController.studentCells) .disposed(by: disposeBag) self.classCell .asObservable() .debug("CELL BIND: ") .observeOn(MainScheduler.instance) .bind(to: classViewController.classCells) .disposed(by: disposeBag) // 新增:给ClassTabCV设置回调,收到班级ID后更新学生数据 self.classViewController.onClassSelected = { [weak self] classId in self?.getStudentsData2(id: classId) } } // ... 其他原有代码不变 }
额外检查点
- 确保你在父视图中正确将
studentsViewController和classViewController添加到了视图层级中(比如通过addChildViewController和addSubview),保证显示的就是你绑定数据的那个实例。 - 检查
getStudentsData2方法中从数据库获取的数据是否正确,避免因为数据库查询返回空数组导致看起来没更新。
这样修改后,点击CollectionView1的cell时,就会触发父视图的getStudentsData2方法,更新studentCells,进而触发CollectionView2的Observable绑定,完成视图刷新。
内容的提问来源于stack exchange,提问作者Chalenger
相关产品推荐
相关产品推荐

