UITableViewCell包含使用RxSwift的UICollectionView

时间:2017-12-04 19:16:36

标签: ios swift uitableview uicollectionview rx-swift

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

使用tableview填充RxSwift的工作非常完美,我使用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]()

然后我在绑定周围做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
}

但我无法相信没有更清洁的&#34;溶液

1 个答案:

答案 0 :(得分:1)

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

我建议您将与data.debts相关的逻辑移到单元格本身,并声明var disposeBag: DisposeBag,然后在prepareForReuse重新进行重新同步。请参阅this answer以供参考。