从UITableView删除行会导致节标题问题?

时间:2019-03-01 20:16:26

标签: ios swift uitableview uitableviewsectionheader

我有一个UITableView,其自定义节标题实现为UITableViewCell。我的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
    }

一切正常呈现,看起来像这样:

Properly rendered UITableView

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

Incorrectly rendered UITableView

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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