通过从数组中删除项目来删除 tableView 中的项目崩溃并显示致命错误:索引超出范围



我正在尝试从表视图中显示的公共静态数组中删除一个项目。删除发生在不同的视图控制器中,当我尝试进入该视图控制器时,应用程序崩溃并显示"索引超出范围"错误

这是我删除项目的地方

func removeItem (info:Dictionary<String, Any>){
let stringKey = info[KEYS.stringKey] as! String
for var i in 0 ..< ItemsViewController.itemVideosList.count {
let current = ItemsViewController.itemVideosList[i]
let currentStringKey = current[KEYS.stringKey] as! String
if stringKey == currentStringKey {
ItemsViewController.itemVideosList.remove(at: i)
return
}
}

我在按钮上调用此方法单击此处:

@IBAction func FavoriteAction(_ sender: Any) {

if Flag {
removeFromFavorite(info: songInfo)
Flag = false
}
else {
ItemsViewController.itemVideosList.insert(songInfo, at: 0)
favFlag = true
}
}

我正在使用此方法填充"项目视图控制器"视图中的表视图DidLoad

func loadItems() {
DispatchQueue.main.async {
self.itemsTableView.reloadData()
}
}

谢谢

您正在尝试在删除时循环访问。这会导致 ItemsViewController.itemVideosList.count 在您删除后无效。

  1. 您只需添加中断而不是返回即可解决问题

    if stringKey == currentStringKey {
    ItemsViewController.itemVideosList.remove(at: i)
    return
    }
    
  2. 更重要的是,不应在迭代集合时修改集合。这会导致不良的副作用。最好只存储 indexToDelete,然后在循环之外删除它。

    func removeItem (info:Dictionary<String, Any>){
    let indexToRemove = -1
    let stringKey = info[KEYS.stringKey] as! String
    for var i in 0 ..< ItemsViewController.itemVideosList.count {
    let current = ItemsViewController.itemVideosList[i]
    let currentStringKey = current[KEYS.stringKey] as! String
    if stringKey == currentStringKey {
    indexToDelete = i            
    break
    }
    }
    ItemsViewController.itemVideosList.remove(at: indexToDelete)
    }
    

注意:

您可以使用高阶函数使迭代更简洁,如下所示:

var list = ["a", "b", "c"]
let index = list.index { (str) -> Bool in
if str == "b" {
return true
}
return false
}

最新更新