删除项目在tableView通过删除项目从阵列崩溃与致命错误:索引超出范围

问题描述:

我想从一个公共静态数组中删除项目已显示在tableview中。缺失在不同的视图 - 控制存在的,当我试图进入该视图控制器的错误“索引超出范围”删除项目在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 
    } 
} 

我在填充“ItemsViewController” viewDidLoad中的表视图用这种方法

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

谢谢

+0

重装表:

你可以使用像这样的高阶函数让你的迭代清洁。尽管如此,问题也可能是其他问题。 –

+0

我在哪里重新加载表?我不能得到从删除方法 –

您正试图循环删除时。这会导致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 
} 
+0

表的引用我认为问题是当我重新加载tableview。 (即使你的回答对我也很重要)。 我添加的打印显示该项目被删除,但当我尝试重新进入视图控制器它崩溃。 –

+0

@IttaiOren删除后,你在同一控制器或执行一些赛格? –

+0

@Tushar Sharma我在同一个控制器上。删除操作将删除静态列表中的项目,并且当用户选择转到该控制器时,该列表将填充表格视图 –