2017-01-14 10 views
0

中綴じ私はRxSwiftに新たなんだと、私はこのコードを持って設定するテキストフィールドが含まれているテーブルビュー:RxSwift - テキストフィールド、変数テーブルビュー

budget.expenses.asObservable() 
    .bindTo(tableView.rx.items(cellIdentifier: ExpenseInputCell.cellIdentifier, cellType: ExpenseInputCell.self)){(row, element, cell) in 

    cell.name.text = element.name.value 
    cell.name.rx.text 
    .bindTo(element.name) 
    .addDisposableTo(self.disposeBag) 
} 
.addDisposableTo(disposeBag) 

tableView.rx.itemDeleted 
    .subscribe(onNext: {indexPath in 
    self.budget.expenses.value.remove(at: indexPath.row) 
    }) 
    .addDisposableTo(disposeBag) 

行が削除されるまで、すべてがあるため、その後、正常に動作します配列内の正しいオブジェクトへのテキストフィールドのバインディングが混在しています。たとえば、テーブルビューに7つのアイテムがあり、5行目を削除すると、新しい5番目と6番目の行に同じ値が設定されます。

答えて

4

問題はelement.nameのサブスクリプションのライフサイクルにあります。 self.disposeBagに接続されているため、セルが再利用されたときには破棄されませんが、selfの場合は破棄されません。

ExpenseInputCellに新しい処分バッグを公開し、セルのprepareForReuseメソッドでそれを更新することをお勧めします。

class ExpenseInputCell: UITableViewCell { 
    // .. 

    var disposeBag = DisposeBag() 

    override func prepareForReuse() { 
    self.diposeBag = DisposeBag() 
    } 
} 

とビューコントローラで

budget.expenses.asObservable() 
    .bindTo(tableView.rx.items(cellIdentifier: ExpenseInputCell.cellIdentifier, cellType: ExpenseInputCell.self)){(row, element, cell) in 

    cell.name.text = element.name.value 
    cell.name.rx.text 
    .bindTo(element.name) 
    .addDisposableTo(cell.disposeBag) 
} 
.addDisposableTo(disposeBag) 
関連する問題