![](/img/trans.png)
[英]Not work UITableView in cellForRowAt But numberOfRowsInsection Work in Swift
[英]UITableView cellForRowAt before numberOfRowsInSection
所以我有一個具有表視圖的視圖控制器。 該視圖控制器具有一個按鈕,單擊該按鈕可打開另一個視圖控制器。 該視圖控制器上有一個按鈕,它將更改表視圖的數據集並關閉視圖控制器。
問題在於更改數據集並關閉視圖控制器時,它調用cellForRowAt
。 但是因為項目數有可能減少,所以我得到了Index out of range
錯誤。
設置了一些斷點后,我意識到這是因為在更新和關閉視圖控制器后,將調用cellForRowAt
,但未調用numberOfRowsInSection
。 因此,行數已更新,但未在表視圖中反映出來。
我可以在cellForRowAt
進行檢查,以查看它是否超出范圍,如果是這種情況,則返回一個空單元格,但這似乎效率很低。 盡管無論如何這都是一個好主意,但在這種情況下似乎是一個臨時解決方案。
那么,我該如何有效而有效地解決這一問題呢?
有兩種解決方案可以解決此問題。
數據集更新后,只需在tableView上調用reloadData即可重新加載所有數據。
如果某些數據被刪除,則使用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.