UITableViewDiffableDataSource:如何设置节标题?

UITableViewDiffableDataSource:如何设置节标题?,uitableview,uikit,ios13,Uitableview,Uikit,Ios13,我正在尝试在UITableViewController中使用新的UITableViewDiffableDataSource设置一个UITableView分区 除了设置节头标题外,一切似乎都很好 根据苹果的文档,UITableViewDiffableDataSource符合UITableViewDataSource,所以我希望这是可能的 我试过: 重写tableView(tableView:,标题ForHeaderInSection:) 在UITableViewController类中 子类化UI

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

除了设置节头标题外,一切似乎都很好

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

我试过:

  • 重写tableView(tableView:,标题ForHeaderInSection:) 在UITableViewController类中
  • 子类化UITableViewDiffableDataSource并在子类中实现tableView(uTableView:,titleForHeaderInSection:)
  • 但这两种方法都没有结果(Xcode 11和iOS13 beta 3)


    当前是否有一种使用
    UITableViewDiffableDataSource
    设置节头标题的方法?

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


    填充标题的默认行为在数据源中总是有点奇怪。对于UITableViewDiffableDataSource,苹果似乎承认这一点,因为它没有提供默认的基于字符串的行为;但是,UITableViewDelegate方法仍像以前一样工作。通过初始化并返回带有所需章节标题的UILabel,实现
    表格视图(uu:viewForHeaderInSection:)
    ,并实现
    表格视图(u:heightForHeaderInSection:)
    以管理所需的高度工作。

    提供了@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
        }
    }
    
    struct用户:可散列{
    变量名称:String
    }
    枚举用户节:字符串{
    案例铂金=“铂金层”
    case gold=“黄金层”
    case silver=“银层”
    }
    类UserTableViewDiffibleDataSource:UITableViewDiffibleDataSource{
    重写func tableView(tableView:UITableView,titleForHeaderInSection:Int)->String{
    guard let user=self.itemIdentifier(for:indepath(item:0,section:section))else{return nil}
    返回self.snapshot().sectionIdentifier(包含项:用户)?.rawValue
    }
    }
    
    self.dataSource
    初始化为
    UITableViewDiffableDataSource
    (将自身设置为
    tableView.dataSource
    )后,将
    tableView.dataSource
    设置回self,即
    UITableViewController
    子类。现在,在您的
    numberOfSectionsInTableView
    numberofrowsinssection
    方法中,将这些转发到
    self.dataSource
    并返回其信息(这是合成模式)。现在,您的
    UITableViewController
    只实现了正常的部分标题,因为它是表的数据源

    我认为,如果已经设置了数据源,则不应将其自身设置为数据源,但我猜他们设计的数据源以最不容易出错的方式工作,因为将
    UITableViewController
    添加到情节提要中,其已设置


    如果这样做,那么在早期的iOS 13 Beta中该类没有打开是有道理的。

    我只是使用了
    snapshot().sectionIdentifiers[section].rawValue
    我的目标是iOS 13并在Xcode 11.4.1中开发,不幸的是它看起来像是
    表视图(\uquo:viewForHeaderInSection:)
    方法在
    UITableViewDiffableDataSource的扩展中不可重写
    我在苹果开发者论坛上发布了一个关于此的问题,希望苹果工程师能看到。因此,结果是
    表视图(uu:viewForHeaderInSection:)
    方法由
    UITableViewDelegate
    提供,而不是
    UITableViewDataSource
    。我的错!