使用 RxSwift 删除多个 UITableView 项目不适用于自定义单元格

Deleting multiple UITableView items with RxSwift does not work with a custom cell

我有一个 UITableView,我使用 RxSwift 绑定项目。简化的代码可能看起来像这样,只是一个 Variable 持有一个数组

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

绑定到UITableView

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)

我使用

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

问题是删除第一项有效,但删除同一位置的第二项无效。就是删除按钮不显示

如果我点击另一行上的删除图标,则会显示删除按钮。它只是不显示在以前删除的项目的 "position" 中。

更新:我发现只有在使用自定义单元格时才会发生这种情况。简单的 StoryBoard 单元格不会发生这种情况。

下面的代码工作正常。也许您的问题出在其他地方?

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()
}

问题出在实际的单元格 class 上。我在其中使用 RxSwift 将 ViewModel 绑定到 UI 并且这段代码是原因

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

我认为在回收单元格之前处理所有绑定是个好主意。我不知道为什么这会导致问题,但在分配新的 ViewModel 之前处理包似乎有效。