首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >删除单元格时索引超出范围

删除单元格时索引超出范围
EN

Stack Overflow用户
提问于 2018-06-09 04:27:34
回答 3查看 748关注 0票数 1

嗨,希望你能帮忙。

在每个单元格中,我都有一个直接从表视图响应的文本字段。我在单元格中通过闭包保存数据。

代码语言:javascript
复制
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并不流畅。

EN

回答 3

Stack Overflow用户

发布于 2018-06-09 06:05:29

你的问题是,当你赋值闭包时,indexPath.row会被捕获,对于你的最后一个单元格,它的值是"4“。如果您随后删除了前面的一个单元格,数组中的最后一个元素现在是"3",但捕获的值没有变化;它仍然是4。

然后,当您编辑最后一个单元格中的文本字段时,捕获的值4将用于访问您的模型,并且您将得到一个数组边界异常。

您可以在执行闭包时使用indexPath(for:)来确定适当的索引路径:

代码语言:javascript
复制
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()
    }
}
票数 2
EN

Stack Overflow用户

发布于 2018-06-09 04:40:41

indexPath.row从0开始。因此,范围将是0-4。如果你在一个数组中使用了5个字符串并且使用了一个.count,那么它将返回一个5。

只需执行indexPath.row - 1以调整1(索引超出范围)。

票数 1
EN

Stack Overflow用户

发布于 2021-10-15 11:28:23

使用tableView.indexPath(for: cell)获取当前索引

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50767963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档