UITableViewDiffableDataSource:如何获取节索引

时间:2019-08-19 17:47:51

标签: ios uitableview ios13

我正在尝试采用新的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
    }
}

有人解决了这个问题吗?为了防万一,我会将其记录为错误。

2 个答案:

答案 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子类。现在,在您的numberOfSectionsInTableViewnumberOfRowsInSection方法中将它们转发到self.dataSource并返回其信息(这是组成模式)。现在,您的UITableViewController只不过是正常执行其节标题,因为它是表的数据源。

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