在删除单元格后进行条件检查的Swift heightForRow

时间:2019-05-10 05:00:33

标签: ios swift uitableview

我有一个dataSource检查来定义cellHeightForRowAt委托

所有代码都可以在添加单元格的情况下正常工作,但不能删除

这是我的代码

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.dataSource.count
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if self.dataSource[indexPath.row].isExclusive {
        return 280.0
    }
    else {
        return 150.0
    }
}

fileprivate func handleCellDeletion(cell: UITableViewCell) {
    let cellIndexPath = self.paymentMethodTableView.indexPath(for: cell)
    guard let indexPath = cellIndexPath else { return }

    self.dataSource.remove(at: indexPath.row)
    self.paymentMethodTableView.beginUpdates()
    self.paymentMethodTableView.deleteRows(at: [indexPath], with: .fade)
    self.paymentMethodTableView.endUpdates()
}

现在,问题是每当删除一个单元格时,它将再次运行heightForRowAt委托,并且这行代码将使索引超出范围异常

if self.dataSource[indexPath.row].isExclusive { // <== this will throw exception

我注意到,即使我已经在reloadingRows之前删除了dataSource数组中的索引,但indexPath.row仍然以某种方式反映了删除之前的总行数

任何人都可以引导我吗?我在这里想念什么?谢谢

1 个答案:

答案 0 :(得分:-1)

您无需致电beginUpdates()endUpdates()

fileprivate func handleCellDeletion(cell: UITableViewCell) {
    let cellIndexPath = self.paymentMethodTableView.indexPath(for: cell)
    guard let indexPath = cellIndexPath else { return }

    self.dataSource.remove(at: indexPath.row)
    self.tableView.reloadData()

}