嗨,希望你能帮忙。
在每个单元格中,我都有一个直接从表视图响应的文本字段。我在单元格中通过闭包保存数据。
cell.tableViewClosure = {[unowned self] in
self.tableView.beginUpdates()
// Singleton
Strings.shared.strings[indexPath.row] = cell.textField.text!
self.tableView.reloadRows(at: [indexPath], with: .automatic)
self.tableView.endUpdates()
}
通过实例我删除了第一个单元格,数据数组计数和行数在日志中是相等的,但如果我尝试编辑最后一个单元格中的文本字段并点击return,应用程序崩溃,索引超出范围。
如果在删除过程中记录-它是数组中的5个字符串,但此正确单元格的indexPath.row是5。
但如果我在删除时重新加载数据-编辑最后一个单元格一切正常,但UI并不流畅。
发布于 2018-06-09 06:05:29
你的问题是,当你赋值闭包时,indexPath.row
会被捕获,对于你的最后一个单元格,它的值是"4“。如果您随后删除了前面的一个单元格,数组中的最后一个元素现在是"3",但捕获的值没有变化;它仍然是4。
然后,当您编辑最后一个单元格中的文本字段时,捕获的值4将用于访问您的模型,并且您将得到一个数组边界异常。
您可以在执行闭包时使用indexPath(for:)
来确定适当的索引路径:
cell.tableViewClosure = {[unowned self] in
if let indexPath = self.tableView.indexPath(for: cell) {
self.tableView.beginUpdates()
Strings.shared.strings[indexPath.row] = cell.textField.text!
self.tableView.reloadRows(at: [indexPath], with: .automatic)
self.tableView.endUpdates()
}
}
发布于 2018-06-09 04:40:41
indexPath.row从0开始。因此,范围将是0-4。如果你在一个数组中使用了5个字符串并且使用了一个.count,那么它将返回一个5。
只需执行indexPath.row - 1
以调整1(索引超出范围)。
发布于 2021-10-15 11:28:23
使用tableView.indexPath(for: cell)
获取当前索引
https://stackoverflow.com/questions/50767963
复制相似问题