2017-12-04 8 views
1

私は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 
} 

しかし、私は "クリーナー"の解決策がないと信じることはできません

+0

固定コードでは、 'disposeBag'に' diposable'を格納しますが、最初のコードには格納しません。あなたはどこにでもそれを保管していますか? – alcarv

+0

@AndreCarvalhoはい私は 'disposeBag'の有無にかかわらず試してみました。違いはありません – gasparuff

答えて

0

問題は、セルがデキューされるたびにdata.debtsをセル内のcollectionViewにバインドすることです。

data.debtsに関連するロジックをセル自体に移動し、prepareForReuseに再インスタンス化するvar disposeBag: DisposeBagを宣言することをお勧めします。参照のためにthis answerを参照してください。

+0

あなたは絶対に正しいです。これはちょっと意味があります...ありがとう – gasparuff

関連する問題