我正在尝试在UITableView
中使用新的UITableViewDiffableDataSource
来设置带有部分的UITableViewController
。
除了设置节标题,一切似乎都可以正常工作。
根据Apple的文档,UITableViewDiffableDataSource
符合UITableViewDataSource
,所以我希望这是可能的。
我尝试过:
但是两种方法都不会导致结果(Xcode 11和iOS13 beta 3)。
当前是否可以使用UITableViewDiffableDataSource
设置节标题?
答案 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
子类。现在,在您的numberOfSectionsInTableView
和numberOfRowsInSection
方法中将它们转发到self.dataSource
并返回其信息(这是组成模式)。现在,您的UITableViewController
只不过是正常执行其节标题,因为它是表的数据源。
我相信UITableViewDiffableDataSource
不应将自己设置为数据源(如果已设置),但我想他们设计了它以最不容易出错的方式工作,因为在故事板上添加了UITableViewController
时,它已经设置。
如果您采用这种方式,那么为什么在iOS 13早期的Beta版中未打开该类是很有意义的。