我正在尝试采用新的iOS 13 UITableViewDiffableDataSource,但是遇到了麻烦。我无法实现
func sectionIndexTitles(for tableView: UITableView) -> [String]?
这是数据源方法,而不是委托方法。因此,既然数据源是UITableViewDiffableDataSource,则需要实现该方法。但事实并非如此。
我尝试将UITableViewDiffableDataSource子类化,并添加了sectionIndexTitles
的实现,但是我的实现从未被调用:
class MyDataSource : UITableViewDiffableDataSource<String,String> {
func sectionIndexTitles(for tableView: UITableView) -> [String]? {
return self.snapshot().sectionIdentifiers // not called
}
}
有人解决了这个问题吗?为了防万一,我会将其记录为错误。
答案 0 :(得分:2)
您需要继承UITableViewDiffableDataSource
,然后覆盖
func sectionIndexTitles(for tableView: UITableView)
由你自己
但是要启用索引功能,您还必须覆盖
func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int)
这是我实现它的一个示例:
import UIKit
import MediaPlayer
class TableViewDiffableDataSource: UITableViewDiffableDataSource<String, MPMediaItemCollection> {
var sectionTitles = [String]()
override func sectionIndexTitles(for tableView: UITableView) -> [String]? {
return sectionTitles
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return sectionTitles[section]
}
override func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
return sectionTitles.firstIndex(of: title) ?? 0
}
}
Credits go to Steve Breen, who led me in the right direction.
答案 1 :(得分:0)
在将self.dataSource
初始化为UITableViewDiffableDataSource
(将其自身设置为tableView.dataSource
)之后,将tableView.dataSource
返回自身,即UITableViewController
子类。现在,在您的numberOfSectionsInTableView
和numberOfRowsInSection
方法中将它们转发到self.dataSource
并返回其信息(这是组成模式)。现在,您的UITableViewController
只不过是正常执行其节标题,因为它是表的数据源。
我相信UITableViewDiffableDataSource
不应将自己设置为数据源(如果已设置),但我想他们设计了它以最不容易出错的方式工作,因为在故事板中添加了UITableViewController
默认为dataSource
和delegate
。