簡體   English   中英

numberOfRowsInSection 調用了未重新加載的部分

[英]numberOfRowsInSection called for a section not being reloaded

在我的表格視圖中,當部分 == 0 時,如果所有部分都有零項,我會為用戶插入一行幫助文本。

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if myArray.flatMap({ $0 }).count == 0 && section == 0 {
            return 1 //so we can show empty row helper text
        } else {
            return myArray[section].count
        }
    }

當允許用戶手動刪除行時,除了第 0 節中沒有行並且我在其他地方刪除唯一剩余的行(比如第 1 節)的情況外,這可以正常工作。 在這種情況下,不會顯示幫助文本。

在刪除時,我為第 1 節調用 reloadSections。

myTableView.reloadSections([indexPath.section], with: .fade)

我也嘗試過 deleteRow 並獲得相同的行為。

myTableView.deleteRows(at: [indexPath], with: .fade)

使用上述任何一種方法,我都會崩潰:

'無效更新:第0節中的行數無效。更新后現有節中包含的行數(1)必須等於更新前該節中包含的行數(0),加上或減去從該部分插入或刪除的行數(0 插入,0 刪除)加上或減去移入或移出該部分的行數(0 移入,0 移出)。

我收到錯誤消息 - 第 0 節未被刪除,現在有一行(在刪除之前沒有)。 但是這是怎么發生的/為什么在這種情況下甚至會調用 numberOfRowsInSection(當我故意不重新加載第 0 節時)?

如果我只是完整的 myTableView.reloadData() - 它可以正常工作而沒有崩潰 - 但是我當然會丟失用戶正在刪除的行的刪除 animation。

想法?

編輯:感謝 PaulW 解決

問題是由於布局原因,可以隨時為所有部分調用 numberOfRowsInSection。 因此,如果我更新第 1 節以刪除最后一項,則第 0 節將在重新加載時返回 1。 因此,在這種情況下,通過主動重新加載第 0 節,我避免了崩潰。

在我的刪除行 function 中,我現在執行以下操作:

if tempRideArray.flatMap({ $0 }).count == 0 {          
     myTableView.reloadSections([0,indexPath.section], with: .fade)
        } else {
     myTableView.deleteRows(at: [indexPath], with: .fade)
}

numberOfRows(in section:)可以隨時為任何部分調用。

tableview 需要知道其他部分中有多少行,以便它可以根據需要調整滾動視圖偏移量。

您的問題是第 0 節的行數由於依賴於myArray的內容而意外更改。

更新數組時,如果數組計數從零變為非零或非零變為零,則還需要重新加載第 0 節。

暫無
暫無

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

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