使用 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 之前处理包似乎有效。
我有一个 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 之前处理包似乎有效。