2017-05-02 1 views
0

を使用してアイテムをバインドするUITableViewがあります。簡体字コードは、次のように配列UITableView複数のUITableViewアイテムをRxSwiftで削除すると、カスタムセルでは機能しません

tableView.register(GroupCell.self) 

data.asObservable().bindTo(tableView.rx.items) { tableView, row, group in 
     let indexPath = IndexPath(row: row, section: 0) 
     let cell = tableView.dequeueReusableCell(GroupCell.self, indexPath: indexPath) 
     return cell 
     } 
     .disposed(by: disposeBag) 

にバインド

let data = Variable<[Int]>([1,2,3,4]) 

を保持するだけでVariableを見ても、私はこの問題は、最初の削除ということである

tableView.rx.itemDeleted.subscribe(onNext: { [unowned self] indexPath in self.data.value.remove(at: indexPath.row)}).disposed(by: disposeBag) 

を使用してアイテムを削除しますアイテムは機能しますが、同じ位置にある2番目のアイテムを削除すると、そのアイテムは削除されません。私は、別の行の削除ボタン番組を削除アイコンをタップすると削除ボタンがちょうど

enter image description here

は表示されません。以前に削除したアイテムの「位置」には表示されません。

更新:私はカスタムセルを使用すると発生します。単純なStoryBoardセルでは発生しません。

答えて

0

問題は実際の細胞クラスでした。私は、UIへのViewModelをバインドするにはでRxSwiftを使用して、このコードは、私は電池をリサイクルされる前に、すべての結合を配置するのは良いアイデアだと思いました原因

override func prepareForReuse() { 
    disposeBag = DisposeBag() 
} 

ました。なぜこの問題が起こるのかはわかりませんが、新しいViewModelを割り当てる前にバッグを廃棄するとうまくいくようです。

+0

これは意味があります。それがなぜこの問題を引き起こすのかを説明するために、私はこのメタファーを使いたいと思っています。観測可能なシーケンスと演算子を設定することはパイプラインを作成するのと同じですが、disposeBagを破棄することはパイプラインにスレッジハンマーを掛けるようなものです。パイプラインが破棄されると、データがパイプラインを通って流れることは期待できません。 –

+0

セルがリサイクルされたら何とか処分してはいけないと思いますか? –

+0

私はこれを行う必要は一度もありませんでしたが、あなたとは違った細胞を構築するかもしれません。 Code Review(https://codereview.stackexchange.com)にいくつかのコードを投稿すると、私に知らせてください。 –

1

以下のコードは正常です。多分あなたの問題は他の場所ですか?

class ViewController: UIViewController { 

    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.isEditing = true 

     data.asObservable().bind(to: tableView.rx.items) { tableView, row, group in 
      let indexPath = IndexPath(row: row, section: 0) 
      let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
      cell.textLabel?.text = "\(group)" 
      return cell 
     } 
     .disposed(by: bag) 

     tableView.rx.itemDeleted 
      .subscribe(onNext: { [unowned self] indexPath in 
       self.data.value.remove(at: indexPath.row) 
      }) 
      .disposed(by: bag) 
    } 

    let data = Variable<[Int]>([1,2,3,4]) 
    let bag = DisposeBag() 
} 
関連する問題