2017-08-08 56 views
0

我想從一個公共靜態數組中刪除項目已顯示在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

我在哪裏重新加載表?我不能得到從刪除方法 –

回答

1

您正試圖循環刪除時。這會導致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我在同一個控制器上。刪除操作將刪除靜態列表中的項目,並且當用戶選擇轉到該控制器時,該列表將填充表格視圖 –