You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

    // ... 其他原有代码不变
}

额外检查点

  1. 确保你在父视图中正确将studentsViewController和classViewController添加到了视图层级中(比如通过addChildViewController和addSubview),保证显示的就是你绑定数据的那个实例。
  2. 检查getStudentsData2方法中从数据库获取的数据是否正确,避免因为数据库查询返回空数组导致看起来没更新。

这样修改后,点击CollectionView1的cell时,就会触发父视图的getStudentsData2方法,更新studentCells,进而触发CollectionView2的Observable绑定,完成视图刷新。

内容的提问来源于stack exchange,提问作者Chalenger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:27:45