私はiOSプロジェクトでRxSwift
を使い始めました。私はUITableViewCell
サブクラスのUITableView
を持っています。そのサブクラス内にはUICollectionView
があります。かなり完璧RxSwift
作品を使用してtableview
を移植RITSWiftを使用したUICollectionViewを含むUITableViewCell
、私は
を(RxDataSourcesを)そのためRxSwift
の別の拡張子を使用していますここで私はそれをやっている方法は次のとおりです。
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)
}
アプリのクラッシュをすることができます(面白いことは、任意の跡形もなく、でもXcodeのクラッシュで)同じテーブルビューのセルに二回呼び出されます。
これを避けるにはどうすればよいですか?
EDIT:
私は解決策を見つけたが、私は、私はそれで本当に満足していないことを認めなければならない...ここでの考え方(テストされ、作品は)だ
は、私は私の中に別の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
}
しかし、私は "クリーナー"の解決策がないと信じることはできません
固定コードでは、 'disposeBag'に' diposable'を格納しますが、最初のコードには格納しません。あなたはどこにでもそれを保管していますか? – alcarv
@AndreCarvalhoはい私は 'disposeBag'の有無にかかわらず試してみました。違いはありません – gasparuff