UITableView自定义节标题

时间:2018-12-06 11:13:45

标签: ios swift uitableview interface-builder uitableviewsectionheader

我想在我的UITableView中添加一些自定义节标题,我在网上搜索了一下,发现许多人正在创建UITableViewCell子类并将其注册为标题,这听起来很糟糕。进行练习,因为对于页眉和页脚有一个特定的类称为UITableViewHeaderFooterView

所以我尝试自己做,我创建了一个xib文件和一个UITableViewHeaderFooterView子类,称为SelectedProductsSectionHeader

这是我连接网点的方式 enter image description here enter image description here enter image description here

这是UITableViewController端的相关代码-

override func viewDidLoad() {
    super.viewDidLoad()

    let selectedProductsSectionHeaderNib = UINib(nibName: "SelectedProductsSectionHeader", bundle: nil)
    tableView.register(selectedProductsSectionHeaderNib, forHeaderFooterViewReuseIdentifier: "selectedProductsHeader")
}

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    if section == SectionIndex.selectedProducts{

        let selectedProductsHeaderCell = tableView.dequeueReusableHeaderFooterView(withIdentifier: "selectedProductsHeader") // throws error
        guard let selectedProductsHeader = selectedProductsHeaderCell as? SelectedProductsSectionHeader else { return nil }

        return selectedProductsHeader
    }

    return nil
}

运行时错误:

  

由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[setValue:forUndefinedKey:]:此类不适用于密钥标签编码兼容的密钥值。'

所以我尝试了其他方法,而不是将File的Owner设置为我的自定义类,而是将View设置为我的自定义类,并且它起作用了。

enter image description here enter image description here enter image description here

我的问题是,为什么第一种方法不起作用?我是否应该使用File的Owner?如果没有,我应该如何使用它?

1 个答案:

答案 0 :(得分:0)

这是一个很好的问题。当您在视图本身上设置类时,它不起作用的原因是它没有完全一个子视图。每当您要将根视图设为子类时,都需要再添加一个容器视图,因为已加载的笔尖需要一个父视图。

您需要做的就是将类设置为根视图,将其拖动到容器视图中并将其约束到超级视图的所有边缘,然后添加子视图,这样便可以使用。