Saya memiliki UITableViewCell, dan itu berisi UICollectionView. Saya meletakkan data untuk tampilan koleksi di tampilan tabel dataSource.

class HomeTableViewCell: UITableViewCell {
    var disposeBag = DisposeBag()
    @IBOutlet weak var collectionItems: UICollectionView!
    var listItem: PublishSubject<HomeResultModel> = PublishSubject<HomeResultModel>()
    let dataSource = RxCollectionViewSectionedReloadDataSource<SectionOfMenuData>(configureCell: {(_, _, _, _) in
        fatalError()
    })

override func awakeFromNib() {
    super.awakeFromNib()
    setup()
    setupBinding()
}

override func prepareForReuse() {
    disposeBag = DisposeBag()
}

func setup() {
    collectionItems.register(UINib(nibName: MenuCollectionViewCell.identifier, bundle: nil), forCellWithReuseIdentifier: MenuCollectionViewCell.identifier)
    collectionItems.register(UINib(nibName: RecipeCollectionViewCell.identifier, bundle: nil), forCellWithReuseIdentifier: RecipeCollectionViewCell.identifier)
    collectionItems.rx.setDelegate(self).disposed(by: disposeBag)
    
    collectionItems.rx.modelAndIndexSelected(HomeListModel.self).subscribe { (model, index) in
        if let recipesID = model.recipesID {
            tlog(tag: self.TAG, sLog: "recipesID : \(recipesID)")
            self.recipeIdSelected.onNext("\(recipesID)")
        }
    }.disposed(by: disposeBag)
    
    dataSource.configureCell = { (dataSource, collectionView, indexPath, item) -> UICollectionViewCell in
        let cellType = dataSource.sectionModels.first?.type ?? .recipeCell
        if cellType == .menuCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MenuCollectionViewCell.identifier, for: indexPath) as! MenuCollectionViewCell
            cell.showInfo(item)
            return cell
        } else {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: RecipeCollectionViewCell.identifier, for: indexPath) as! RecipeCollectionViewCell
            cell.showInfo(item.recipesName ?? "", imageLink: item.imageThumb ?? "")
            return cell
        }
    }
}

func setupBinding() {        
    listItem.map { model -> [SectionOfMenuData] in
        let modelID = try JSONEncoder().encode(model.id)
        let modelResultID = String.init(data: modelID, encoding: .utf8)!
        return [SectionOfMenuData(type: modelResultID == "0" ? .menuCell : .recipeCell, id: modelResultID, items: model.list)]
    }.bind(to: collectionItems.rx.items(dataSource: dataSource))
    .disposed(by: disposeBag)
}
}

Saya meneruskan data untuk tableviewcell dengan kode:

let dataSource = RxTableViewSectionedReloadDataSource<SectionOfHome> { dataSource, tableView, indexPath, item in
            let cell = tableView.dequeueReusableCell(withIdentifier: HomeTableViewCell.identifier, for: indexPath) as! HomeTableViewCell
            cell.listItem.onNext(item)
            return cell
        }

Pertama tunjukkan ok, tetapi ketika menggulir tampilan tabel, saya mengatur ulang DisposeBag di:

func prepareForReuse{ 
    disposeBag = DisposeBag()
}

Dan tampilan tabel ditampilkan kosong. Seberapa salah saya dalam hal ini?

1
tam nguyen 12 Mei 2021, 06:10

1 menjawab

Jawaban Terbaik

Langganan Anda ke listItems akan dibuang saat sel digunakan kembali dan tidak pernah dibuat ulang. Anda harus menjalankan tugas satu kali di awakeFromNib dan memindahkan binding spesifik sel individual ke fungsi yang dapat Anda panggil setelah menyetel ulang disposalBag di prepareForReuse.

0
eliot 12 Mei 2021, 04:19