簡體   English   中英

UITableView cellForRowAt在numberOfRowsInSection之前

[英]UITableView cellForRowAt before numberOfRowsInSection

所以我有一個具有表視圖的視圖控制器。 該視圖控制器具有一個按鈕,單擊該按鈕可打開另一個視圖控制器。 該視圖控制器上有一個按鈕,它將更改表視圖的數據集並關閉視圖控制器。

問題在於更改數據集並關閉視圖控制器時,它調用cellForRowAt 但是因為項目數有可能減少,所以我得到了Index out of range錯誤。

設置了一些斷點后,我意識到這是因為在更新和關閉視圖控制器后,將調用cellForRowAt ,但未調用numberOfRowsInSection 因此,行數已更新,但未在表視圖中反映出來。

我可以在cellForRowAt進行檢查,以查看它是否超出范圍,如果是這種情況,則返回一個空單元格,但這似乎效率很低。 盡管無論如何這都是一個好主意,但在這種情況下似乎是一個臨時解決方案。

那么,我該如何有效而有效地解決這一問題呢?

有兩種解決方案可以解決此問題。

  1. 數據集更新后,只需在tableView上調用reloadData即可重新加載所有數據。

  2. 如果某些數據被刪除,則使用deleteRows(at:with :)方法。

用於單行刪除

data.remove(at: index)
self.tableView.deleteRows(at: [indexPath], with: .fade)

用於插入多行刪除

 var indexPaths: [IndexPath] = []
 for index in indexArray
   data.remove(at: index)
   indexPaths.append(IndexPath(item: index, section: 0))
 }

 if #available(iOS 11.0, *) {
    self.tableView.performBatchUpdates({
       self.tableView.deleteRows(at: indexPaths, with: .fade)
    })
 } else {
     self.tableView.beginUpdates()
     self.tableView.deleteRows(at: indexPaths, with: .fade)
     self.tableView.endUpdates()
 }

如果要刪除多行,只需創建一個具有匹配行索引的索引路徑數組,然后將其傳遞給delete函數。

編輯:僅將批處理更新用於多個插入/刪除/移動操作。 根據蘋果文檔

UITableView將行或節的任何插入推遲到處理完行或節的刪除/插入之后。 無論插入和刪除方法調用如何排序,都遵循此順序。

您可以在viewWillAppear方法中調用tableView.reloadData。 因此,它將再次使用新數據重新加載完整的tableview。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM