viewforHeaderInSection

viewforHeaderInSection

这使我发疯。

  • 我有一个视图控制器,UITableViewController的子类。
  • 将表视图的数据源替换为自定义数据源对象,而不是视图控制器(默认情况下,UITableViewController既是其表视图的代理又是数据源)。
  • 自定义数据源未实现tableView(_:titleForHeaderInSection:)
  • 视图控制器(委托)实现:
  • tableView(_:viewforHeaderInSection:)
  • tableView(_:heightForHeaderInSection:)
  • tableView(_:estimatedHeightForHeaderInSection)

  • ...两个都没有被调用。
    结果,我的表​​视图部分不显示任何标题。

    如果我指定表格视图的全局部分标题高度:
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.estimatedSectionHeaderHeight = 12 // (say)
    

    ...然后显示空白标题,但是tableView(_:titleForHeaderInSection:)仍不称为,并且我的自定义标题视图从不显示。

    之前也曾提出过类似的问题,Apple的文档似乎并非100%正确,但是我确信我正在做所有必需的事情(我已经尝试了所有配置)。

    我想念什么?

    代码库很大,不是我的;也许我错过了一些东西,但不知道还要寻找什么...

    更新

    我创建了一个新的最小项目进行测试,事实证明,我只需要实现这两个委托方法(而无需修改表视图的任何属性):
    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) // (say)
        view.backgroundColor = UIColor.red // (say)
        return view
    }
    
    override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 10.0 // (say)
    }
    

    ...显示我的自定义部分标题视图。

    但是,不能在我现有的项目上使用相同的设置。某些地方一定在干扰...

    更新2

    我订阅了UITableView以查看发生了什么,但仍然无法弄清楚(请参阅内联注释):

    导入UIKit
    class DebugTableView: UITableView {
    
        // GETS EXECUTED:
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    
        override var estimatedSectionHeaderHeight: CGFloat {
            // NEVER GETS EXECUTED:
            get {
                return super.estimatedSectionHeaderHeight
            }
            // NEVER GETS EXECUTED:
            set (newValue) {
                super.estimatedSectionHeaderHeight = newValue
            }
        }
    
        override var sectionHeaderHeight: CGFloat {
            // NEVER GETS EXECUTED:
            get {
                return super.sectionHeaderHeight
            }
            // NEVER GETS EXECUTED:
            set (newValue) {
                super.sectionHeaderHeight = newValue
            }
        }
    
        // NEVER GETS EXECUTED:
        override func headerView(forSection section: Int) -> UITableViewHeaderFooterView? {
            let view = super.headerView(forSection: section)
            return view
        }
    
        // GETS EXECUTED ONCE PER CELL:
        override func rectForHeader(inSection section: Int) -> CGRect {
            var rect = super.rectForHeader(inSection: section)
            rect.size.height = 1000 // HAS NO EFFECT
            return rect
        }
    }
    

    最佳答案

    您只需要设置sectionHeaderHeight,不仅要估计高度!

    喜欢,

    迅捷4.0

        tableView.sectionHeaderHeight = UITableView.automaticDimension
        tableView.estimatedSectionHeaderHeight = 25
    

    然后只需覆盖viewForHeaderInSection即可。无需覆盖其他任何代表!

    10-08 05:58