我具有表视图,该表视图使用以下命令删除某些行:
func deleteRows(_ indecies: [Int]) {
guard !indecies.isEmpty else { return }
let indexPathesToDelete: [IndexPath] = indecies.map{ IndexPath(row: $0, section: 0)}
let previousIndex = IndexPath(row: indecies.first! - 1, section: 0)
tableView.deleteRows(at: indexPathesToDelete, with: .none)
tableView.reloadRows(at: [previousIndex], with: .none)
}
在cellForRow
中,我的单元格具有“ tap”闭包,如下所示:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard indexPath.row < presenter.fields.count else { return EmptyCell() }
let field = presenter.fields[indexPath.row]
switch field.cellType {
case .simple:
guard let model = field as? SimpleTextItem else { return EmptyCell() }
let cell = SimpleTextCell()
cell.setup(label: LabelSL.regularSolidGray(), text: model.text, color: Theme.Color.bleakGray)
return cell
case .organization:
guard let model = field as? OrganizationFilterItem else { return EmptyCell() }
let cell = OrganizationFilterCell()
cell.setup(titleText: model.title,
holdingNumberText: model.holdingNumberText,
isChosed: model.isChosed,
isHolding: model.isHolding,
isChild: model.isChild,
bottomLineVisible: model.shouldDrawBottomLine)
cell.toggleControlTapped = {[weak self] in
self?.presenter.tappedItem(indexPath.row)
}
return cell
}
}
何时
cell.toggleControlTapped = {[weak self] in
self?.presenter.tappedItem(indexPath.row)
}
在删除行后点击,索引通过是错误的(旧的)。例如,我有10行,我删除了2-3-4-5行,然后我点击了2行(删除前为6行)。该方法传递的是“ 6”而不是“ 2”。
问题实际上是通过在tableView.reloadData(
函数中添加deleteRows
)来解决的,但是,您可能会假设动画顺利消失了,而且看起来很粗糙而且不好看。为什么表仍然通过旧索引以及如何解决?
答案 0 :(得分:1)
一个很简单的解决方案是在闭包中传递单元格,以获取实际索引路径
好好玩
var toggleControlTapped : ((UITableViewCell) -> Void)?
称呼
toggleControlTapped?(self)
处理
cell.toggleControlTapped = {[weak self] cell in
guard let actualIndexPath = self?.tableView.indexPath(for: cell) else { return }
self?.presenter.tappedItem(actualIndexPath.row)
}
旁注:重复使用单元格。使用默认的初始化程序创建单元格是非常糟糕的做法。
答案 1 :(得分:-2)
请确保也更新您的数据,索引从表视图的numberofrows函数中出现