【问题标题】:UITableViewDiffableDataSource: how to set section header titles?UITableViewDiffableDataSource:如何设置节标题?
【发布时间】:2019-11-26 07:53:23
【问题描述】:

我正在尝试使用UITableViewController 中的新UITableViewDiffableDataSource 设置一个UITableView

除了设置节标题之外,一切似乎都正常。

根据 Apple 的文档,UITableViewDiffableDataSource 符合 UITableViewDataSource,所以我期待这是可能的。

我试过了:

  1. 覆盖 tableView(_tableView:, titleForHeaderInSection 部分:) 在 UITableViewController 类中
  2. 子类化 UITableViewDiffableDataSource 并在子类中实现 tableView(_ tableView:, titleForHeaderInSection section:)

但两种方式都没有结果(Xcode 11 和 iOS13 beta 3)。

目前有没有办法使用UITableViewDiffableDataSource 设置节标题?

【问题讨论】:

    标签: uitableview uikit ios13


    【解决方案1】:

    提供@particleman 解释的代码示例。

    struct User: Hashable {
        var name: String
    }
    
    enum UserSection: String {
        case platinum = "Platinum Tier"
        case gold = "Gold Tier"
        case silver = "Silver Tier"
    }
    
    class UserTableViewDiffibleDataSource: UITableViewDiffableDataSource<UserSection, User> {
        override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
            guard let user = self.itemIdentifier(for: IndexPath(item: 0, section: section)) else { return nil }
            return self.snapshot().sectionIdentifier(containingItem: user)?.rawValue
        }
    }
    

    【讨论】:

    • 我刚用snapshot().sectionIdentifiers[section].rawValue
    • 或更简洁一点:sectionIdentifier(for: section)?.rawValue
    【解决方案2】:

    更新:从 beta 8 开始,您现在可以在 UITableViewDiffableDataSource 子类中实现 tableView(_ tableView:, titleForHeaderInSection section:) 并且它可以正常工作。

    在数据源中填充标题标题的默认行为总是有点奇怪。对于 UITableViewDiffableDataSource,Apple 似乎通过不提供默认的基于字符串的行为来承认这一点;但是,UITableViewDelegate 方法继续像以前一样工作。实现tableView(_:viewForHeaderInSection:),方法是初始化并返回带有所需章节标题的UILabel,并实现tableView(_:heightForHeaderInSection:) 来管理所需的高度。

    【讨论】:

    • 我的目标是 iOS 13 并在 Xcode 11.4.1 中开发,可悲的是,tableView(_:viewForHeaderInSection:) 方法似乎无法在 UITableViewDiffableDataSource 的扩展中被覆盖 ?
    • 我已经在 Apple 开发者论坛 here 上发布了一个关于此的问题,但不太希望 Apple 工程师会看到它。
    • 所以原来tableView(_:viewForHeaderInSection:)方法是由UITableViewDelegate而不是UITableViewDataSource提供的。我的错!
    【解决方案3】:

    在将self.dataSource 初始化为UITableViewDiffableDataSource(将自身设置为tableView.dataSource)后,将tableView.dataSource 设置回自身,即UITableViewController 子类。现在在您的 numberOfSectionsInTableViewnumberOfRowsInSection 方法中将它们转发到 self.dataSource 并返回其信息(这是组合模式)。现在您的 UITableViewController 只是正常实现其部分标题,因为它是表的数据源。

    我相信 UITableViewDiffableDataSource 不应该将自己设置为数据源,如果已经设置,但我猜他们设计它以最不容易出错的方式工作,因为 UITableViewController 添加到故事板它已经设置。

    如果你这样做,那么为什么在早期的 iO​​S 13 测试版中没有开放课程是有道理的。

    【讨论】:

      猜你喜欢
      • 2020-02-22
      • 2020-01-30
      • 2019-05-29
      • 2012-03-22
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      相关资源
      最近更新 更多