gpt4 book ai didi

ios - 包含使用 RxSwift 的 UICollectionView 的 UITableViewCell

转载 作者:可可西里 更新时间:2023-11-01 01:59:37 26 4
gpt4 key购买 nike

我开始在我的 iOS 项目中使用 RxSwift,我有一个带有自定义 UITableViewCell 子类的 UITableView。在该子类中,我有一个 UICollectionView

使用 RxSwift 填充 tableview 非常完美,我为此使用了 RxSwift 的另一个扩展 ( RxDataSources )

这是我的做法:

    self.dataSource = RxTableViewSectionedReloadDataSource<Section>(configureCell: {(section, tableView, indexPath, data)  in
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCellWithCollectionView

switch indexPath.section {
case 0:
cell.collectionViewCellNibName = "ContactDataItemCollectionViewCell"
cell.collectionViewCellReuseIdentifier = "contactDataItemCellIdentifier"
case 1, 2:
cell.collectionViewCellNibName = "DebtCollectionViewCell"
cell.collectionViewCellReuseIdentifier = "debtCellIdentifier"
default:
break
}
cell.registerNibs(indexPath.section, nativePaging: false, layoutDirection: indexPath.section != 0 ? .horizontal : .vertical)

let cellCollectionView = cell.collectionView!

data.debts.asObservable().bind(to: cellCollectionView.rx.items(cellIdentifier: "debtCellIdentifier", cellType: DebtCollectionViewCell.self)) { row, data, cell in
cell.setup(debt: data)
}


return cell

})

这确实有效。但是当 tableview 单元格滚出屏幕并重新出现时,问题就出现了。这会从上面触发代码块,并在以下情况下让应用程序崩溃

    data.debts.asObservable().bind(to: cellCollectionView.rx.items(cellIdentifier: "debtCellIdentifier", cellType: DebtCollectionViewCell.self)) { row, data, cell in
cell.setup(debt: data)
}

在同一个 tableview 单元格上被调用两次(有趣的是,即使 Xcode 崩溃也没有任何痕迹)。

我该怎么做才能避免这种情况?

编辑:

我找到了一个解决方案,但我必须承认我对它不是很满意...这是我的想法(经过测试并有效)

我在我的类中定义了另一个Dictionary:

var boundIndizes = [Int: Bool]()

然后我围绕绑定(bind)创建一个 if,如下所示:

if let bound = self.boundIndizes[indexPath.section], bound == true {
//Do nothing, content is already bound
} else {
data.debts.asObservable().bind(to: cellCollectionView.rx.items(cellIdentifier: "debtCellIdentifier", cellType: DebtCollectionViewCell.self)) { row, data, cell in
cell.setup(debt: data)
}.disposed(by: self.disposeBag)
self.boundIndizes[indexPath.section] = true
}

但我不敢相信没有“更清洁”的解决方案

最佳答案

问题是每次单元格出列时,您都将 data.debts 绑定(bind)到单元格中的 collectionView。

我建议您将与 data.debts 相关的逻辑移动到单元格本身,并声明一个 var disposeBag: DisposeBag,您可以在 上重新实例化它prepareForReuse。参见 this answer供引用。

关于ios - 包含使用 RxSwift 的 UICollectionView 的 UITableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47640412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com