从 UITableView 中删除行会导致部分标题问题?

Posted

技术标签:

【中文标题】从 UITableView 中删除行会导致部分标题问题?【英文标题】:Deleting row from UITableView causes section header issues? 【发布时间】:2019-03-01 20:16:25 【问题描述】:

我有一个UITableView,其自定义部分标题实现为UITableViewCells。我UITableViewDelegate的相关方法如下:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
        log.debug("Creating header for section \(section)")
        let headerCell = tableView.dequeueReusableCell(withIdentifier: "SectionHeaderCell") as! JournalEntrySectionHeaderTableViewCell

        let keys = Array(self.journalEntries.keys.sorted())
        let date = keys[section]

        let dateFormatter = DateFormatter()
        let template = "MMMMd, yyyy"

        dateFormatter.setLocalizedDateFormatFromTemplate(template)
        let dateStr = dateFormatter.string(from: date)
        headerCell.titleLabel?.text = dateStr

        let theme = ThemeManager.shared.currentTheme()
        headerCell.backgroundColor = theme.entryListHeaderBackgroundColor
        headerCell.titleLabel?.textColor = theme.entryListHeaderTextColor

        return headerCell
    

一切都正确渲染,看起来像这样:

但是,当我通过调用self.entryTableView?.deleteRows(at: [indexPath], with: .automatic) 来删除UITableViewCell 时,在执行动画后,节标题未正确呈现。这是生成的渲染:

您会在此屏幕截图中注意到,我从 2019 年 3 月 9 日部分删除了一行。这样做之后,2019 年 3 月 26 日部分的部分标题根本不会呈现。如果我向下滚动表格然后向上滚动,则部分标题会按预期正确呈现。

我以前从未见过这样的事情,如果我删除我的自定义viewForHeaderInSection 实现并简单地使用titleForHeaderInSection,它就不会发生。但是,这不是一个选项,因为我需要更改部分标题的背景颜色以匹配我们的 UI 主题。有没有人遇到过这个?知道可能是什么问题吗?

【问题讨论】:

您能否为调用self.entryTableView?.deleteRows(at: [indexPath], with: .automatic)的函数添加代码? 【参考方案1】:

我可能认为可能存在 2 个潜在问题。

    您能否在调用之前验证是否删除了 dataSource 元素

    self.entryTableView?.deleteRows(at: [indexPath], with: .automatic)

    let keys = Array(self.journalEntries.keys.sorted())

删除元素后此键会更改吗?这可能会导致意外行为。

【讨论】:

以上是关于从 UITableView 中删除行会导致部分标题问题?的主要内容,如果未能解决你的问题,请参考以下文章

从 .csv 文件中删除一些行会导致向其中添加 NaN 列

ios - UITableView 滞后于多个部分

删除 UITableView 的最后一部分会导致异常

从 UITableView 中删除值会导致崩溃

删除行会导致 MySQL 中的数据库存储增长

如何从 UITableView (iPhone/iPad) 中删除部分