UITableViewDiffableDataSource:如何设置节标题?

时间:2019-07-17 13:04:40

标签: uitableview uikit ios13

我正在尝试在UITableView中使用新的UITableViewDiffableDataSource来设置带有部分的UITableViewController

除了设置节标题,一切似乎都可以正常工作。

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

我尝试过:

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

但是两种方法都不会导致结果(Xcode 11和iOS13 beta 3)。

当前是否可以使用UITableViewDiffableDataSource设置节标题?

3 个答案:

答案 0 :(得分:4)

在@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
    }
}

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

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

如果您采用这种方式,那么为什么在iOS 13早期的Beta版中未打开该类是很有意义的。