这个快把我逼疯了。
UITableViewController
的子类。UITableViewController
既是表视图的delgate,也是其数据源)。tableView(_:titleForHeaderInSection:)
。- `tableView(_:viewforHeaderInSection:)`
- `tableView(_:heightForHeaderInSection:)`
- `tableView(_:estimatedHeightForHeaderInSection)`
...neither被称为.
因此,我的表视图部分不显示任何标题。
如果我指定表视图的全局节标题高度:
override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedSectionHeaderHeight = 12 // (say)
将显示...then空白标题,但tableView(_:titleForHeaderInSection:)
等人的仍未被称为,而且我的自定义标头视图永远不会显示。
以前也有过类似的问题,苹果的文档似乎不是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)
}
...to显示我的自定义节标题视图。
但是,--相同的设置--在我现有的项目上不起作用。一定是有什么地方干扰了..。
更新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
}
}
发布于 2017-04-14 10:55:50
我发现了问题。
结果发现,有一个辅助对象超越了表视图委托的角色并隐藏了它.
这门课:
UITableViewDelegate
协议并实现其方法的大部分(但没有与页眉/页脚相关的方法),viewDidAppear()
方法中表视图的委托,这就是为什么在我的表视图控制器上调用的UITableViewDelegate
的一些方法的原因,还有一些方法没有调用。
我通过重写表视图的delegate
属性发现了这一点:
class DebugTableView: UITableView {
// ...
override var delegate: UITableViewDelegate? {
get {
return super.delegate
}
set (newValue) {
super.delegate = newValue // < BREAKPOINT HERE
}
}
绝望的...out (没有充分的理由怀疑代表被交换了,因为大多数方法都有效.)
妈的,我是不是恨这种肮脏的黑客.这几乎是#define true false
的地盘,谢什.
发布于 2017-04-14 08:53:06
你只需要设置sectionHeaderHeight
,不仅是估计高度!
喜欢,
Swift 4.0
tableView.sectionHeaderHeight = UITableView.automaticDimension
tableView.estimatedSectionHeaderHeight = 25
然后重写viewForHeaderInSection
。也不需要凌驾任何其他代表!
https://stackoverflow.com/questions/43407865
复制相似问题