gpt4 book ai didi

Swift: fatal error :从 TableView 中删除项目时数组索引超出范围

转载 作者:行者123 更新时间:2023-11-30 10:06:50 24 4
gpt4 key购买 nike

我已经设置了一个表来从数据库中提取数据。用户可以通过复选框 (table.editing = true, iirc) 和删除按钮手动从表(以及数据库)中删除项目。这可以一次完成一个,也可以一次全部完成。

不幸的是,每当我检查所有内容是否删除时,应用程序都会崩溃并出现以下错误:

fatal error: Array index out of range

如果我仅选择并删除一个或任意数量的表行(只要我不选择所有内容),就不会发生这种情况。

这是我的删除按钮代码:

func deleteButtonPressed(sender: AnyObject) {
if (self.pureSteamFormView.tableCalibration.editing == true) {
if (self.pureSteamFormView.tableCalibration.indexPathsForSelectedRows!.count >= 1) {
for indexPath in self.pureSteamFormView.tableCalibration.indexPathsForSelectedRows!.sort({ $0.row < $1.row}) {
let calibTable : FormSteamPurityCalibration = self.steamPurityCalibrationTableList[indexPath.row] /* <--- ERROR HERE */

DatabaseManager.getInstance().deleteData("FormSteamPurityCalibration", "ID = \(calibTable.ID)")

self.steamPurityCalibrationTableList.removeAtIndex(indexPath.row)
}
self.pureSteamFormView?.tableCalibration.reloadData()
}
}
}

据我所知,它正在尝试删除索引处的行,该索引可能不再存在(?),因为前一行也被删除,但我对此不确定。

我尝试输入以下代码:

self.steamPurityCalibrationTableList.removeAtIndex(indexPath.row)

在它自己的 for 循环 block 中,错误立即移到那里。

我还尝试完全删除 removeAtIndex 部分,依靠 reloadData() 来自动更新表格,但它不起作用 - 数据被删除来自数据库,但保留在表中(尽管离开该 View 并返回那里更新表)。

请问有什么建议吗?谢谢。

最佳答案

这里的问题是您要先删除最低的索引,然后再删除较大的索引。让我用一个例子来解释一下:

想象一下,你的数组中有 4 个元素:

let array = ["Element1", "Element2", "Element3", "Element4"]

您正在尝试删除索引 1 和 3 处的元素:

for index in [1, 3] {
array.removeAtIndex(index)
}

您的程序将首先删除索引 1 处的元素,留下以下数组:

["Element1", "Element3", "Element4"]

在循环的第二遍中,它将尝试删除索引 3 处的元素。该元素不再存在,因为它已移至索引 2。

对此的一个解决方案是开始删除之前索引较大的元素,因此您可以在代码中进行更改

for indexPath in self.pureSteamFormView.tableCalibration.indexPathsForSelectedRows!.sort({ $0.row < $1.row}) {

for indexPath in self.pureSteamFormView.tableCalibration.indexPathsForSelectedRows!.sort({ $0.row > $1.row}) {

更好的解决方案是过滤数据数组以仅包含您希望保留的元素,因此不要:

for indexPath in self.pureSteamFormView.tableCalibration.indexPathsForSelectedRows!.sort({ $0.row < $1.row}) {
let calibTable : FormSteamPurityCalibration = self.steamPurityCalibrationTableList[indexPath.row]
DatabaseManager.getInstance().deleteData("FormSteamPurityCalibration", "ID = \(calibTable.ID)")
self.steamPurityCalibrationTableList.removeAtIndex(indexPath.row)
}

你可以这样做:

self.steamPurityCalibrationTableList.filter {
if let index = self.steamPurityCalibrationTableList.indexOf ({ $0 })
{
for indexPath in self.pureSteamFormView.tableCalibration.indexPathsForSelectedRows! {
if indexPath.row == index { return false }
}

return true
}
}

关于Swift: fatal error :从 TableView 中删除项目时数组索引超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35473829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com