首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tableView(_:viewforHeaderInSection:)未被调用

tableView(_:viewforHeaderInSection:)未被调用
EN

Stack Overflow用户
提问于 2017-04-14 08:22:09
回答 2查看 2.1K关注 0票数 1

这个快把我逼疯了。

  1. 我有一个视图控制器,UITableViewController的子类。
  2. 表视图的数据源被自定义数据源对象替换,而视图控制器除外(默认情况下,UITableViewController既是表视图的delgate,也是其数据源)。
  3. 自定义数据源不实现tableView(_:titleForHeaderInSection:)
  4. 视图控制器(委托)实现:
代码语言:javascript
运行
复制
- `tableView(_:viewforHeaderInSection:)`
- `tableView(_:heightForHeaderInSection:)`
- `tableView(_:estimatedHeightForHeaderInSection)`

...neither被称为.

因此,我的表视图部分不显示任何标题。

如果我指定表视图的全局节标题高度:

代码语言:javascript
运行
复制
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.estimatedSectionHeaderHeight = 12 // (say)

将显示...then空白标题,但tableView(_:titleForHeaderInSection:)等人的仍未被称为,而且我的自定义标头视图永远不会显示。

以前也有过类似的问题,苹果的文档似乎不是100%正确的,但是我确信我正在做所有需要的事情(我已经尝试了所有的配置)。

,我错过了什么?

代码库是大的,而不是我的;也许我在这里遗漏了什么,但不知道还能找到什么。

更新

我创建了一个要测试的新的、最小的项目,结果证明我只需要实现这两个委托方法(并且不修改表视图的任何属性):

代码语言:javascript
运行
复制
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)
}

...to显示我的自定义节标题视图。

但是,--相同的设置--在我现有的项目上不起作用。一定是有什么地方干扰了..。

更新2

我对UITableView进行了细化,以查看所发生的事情,但仍然无法理解它(参见内联注释):

导入UIKit

代码语言:javascript
运行
复制
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
    }
} 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-14 10:55:50

我发现了问题。

结果发现,有一个辅助对象超越了表视图委托的角色并隐藏了它.

这门课:

  • 采用UITableViewDelegate协议并实现其方法的大部分(但没有与页眉/页脚相关的方法),
  • 将自身设置为表视图控制器的viewDidAppear()方法中表视图的委托,
  • 保存对表视图控制器的引用,
  • 当调用(例如) tableView(_:didSelectRowAtIndexPath:)的实现时,它反过来调用表视图控制器的等效方法,给人的印象是视图控制器仍然是委托: 类ManInTheMiddle: NSObject,UITableViewDelegate { var formerDelegate: UITableViewController?tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath) { formerDelegate?.tableView(tableView,didSelectRowAt: indexPath) //做其他事情.}}

这就是为什么在我的表视图控制器上调用UITableViewDelegate的一些方法的原因,还有一些方法没有调用。

我通过重写表视图的delegate属性发现了这一点:

代码语言:javascript
运行
复制
class DebugTableView: UITableView {

    // ...
    override var delegate: UITableViewDelegate? {
        get {
            return super.delegate
        }
        set (newValue) {
            super.delegate = newValue // < BREAKPOINT HERE
        }
    }

绝望的...out (没有充分的理由怀疑代表被交换了,因为大多数方法都有效.)

妈的,我是不是这种肮脏的黑客.这几乎是#define true false的地盘,谢什.

票数 1
EN

Stack Overflow用户

发布于 2017-04-14 08:53:06

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

喜欢,

Swift 4.0

代码语言:javascript
运行
复制
    tableView.sectionHeaderHeight = UITableView.automaticDimension
    tableView.estimatedSectionHeaderHeight = 25

然后重写viewForHeaderInSection。也不需要凌驾任何其他代表!

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

https://stackoverflow.com/questions/43407865

复制
相关文章

相似问题

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