首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UITableViewDiffableDataSource:如何设置节标题?

UITableViewDiffableDataSource:如何设置节标题?
EN

Stack Overflow用户
提问于 2019-07-17 13:04:40
回答 4查看 5.4K关注 0票数 18

我正在尝试在UITableView中使用新的UITableViewDiffableDataSource来设置一个包含部分的UITableViewController

除了设置节标题外,一切看起来都很好。

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

我试过:

  1. 重写tableView类中的UITableViewController (_ tableView:,titleForHeaderInSection节:)
  2. 子类UITableViewDiffableDataSource并在子类中实现tableView(_ tableView:,titleForHeaderInSection节:)

但是这两种方式都没有结果(Xcode 11和iOS13 beta 3)。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-08-18 18:09:57

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

在数据源中填充标题标题的默认行为总是有些奇怪。对于UITableViewDiffableDataSource,苹果似乎承认了这一点,因为它没有提供默认的基于字符串的行为;然而,UITableViewDelegate方法仍然像以前一样工作。通过初始化和返回具有所需节标题的UILabel来实现UILabel,并实现tableView(_:heightForHeaderInSection:)来管理所需的高度。

票数 13
EN

Stack Overflow用户

发布于 2019-08-26 10:43:35

提供@particleman解释的代码示例。

代码语言:javascript
复制
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
    }
}
票数 15
EN

Stack Overflow用户

发布于 2022-02-02 16:02:53

请允许我提出一个相当灵活的普遍解决办法:

声明子类:

代码语言:javascript
复制
class StringConvertibleSectionTableViewDiffibleDataSource<UserSection: Hashable, User: Hashable>: UITableViewDiffableDataSource<UserSection, User> where UserSection: CustomStringConvertible {
    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return sectionIdentifier(for: section)?.description
    }
}

用法示例:

代码语言:javascript
复制
class ComitsListViewController: UITableViewController {

private var diffableDataSource = StringConvertibleSectionTableViewDiffibleDataSource<String, Commit>(tableView: tableView) { (tableView, indexPath, commit) -> UITableViewCell? in
            let cell = tableView.dequeueReusableCell(withIdentifier: "Commit", for: indexPath)
            cell.configure(with: commit)
            return cell
        }

}

你不仅仅局限于String思想。您可以通过为您的节类型实现description var of CustomStringConvertible协议来控制显示什么作为节标题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57076548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档