UITableView:viewForHeaderInSection:在reloadData过程中没有调用:
我已经build立了正确的委托和数据源链接的tableview .. reloadData方法调用除了viewForHeaderInSection之外的数据源和委托方法:..
为什么?
使用tableView:viewForHeaderInSection:
要求你也实现tableView:heightForHeaderInSection:
tableView:viewForHeaderInSection:
这应该返回一个适当的非零高度的标题。 还要确保你不要实现tableView:titleForHeaderInSection:
你应该只使用其中一个( viewForHeader
或titleForHeader
)。
诀窍是这两个方法属于不同的UITableView协议:
tableView:titleForHeaderInSection:
是一个UITableViewDataSource
协议方法,其中tableView:viewForHeaderInSection
属于协议UITableViewDelegate
(我不知道为什么,有什么意见?)
这意味着
-
如果你实现的方法,但只分配自己作为
UITableView
的dataSource
,你的tableView:viewForHeaderInSection
实现将被忽略,将永远不会被调用。 -
tableView:viewForHeaderInSection
具有更高的优先级。 如果你实现了这两个方法,并将自己指定为UITableView
的dataSource
和delegate
,则将返回节标题的视图,但是您的tableView:titleForHeaderInSection:
将被忽略。 -
出于研究目的,我已经删除了我的
tableView:heightForHeaderInSection:
它运行良好,似乎并没有影响上述程序。 但是注释文档指出tableView:viewForHeaderInSection
需要正确的工作; 所以为了安全起见,这是明智的。
@rmaddy错误地规定了两次:实际上, tableView:viewForHeaderInSection:
并不要求你也实现了tableView:heightForHeaderInSection:
titleForHeader
同时调用titleForHeader
和viewForHeader
也是非常好的。 我将正确地陈述规则只是为了logging:
规则只是简单的viewForHeader
不会被调用,除非你以某种方式给头一个高度。 您可以通过三种方式的任意组合来完成此操作:
-
实现
tableView:heightForHeaderInSection:
-
设置表格的
sectionHeaderHeight
。 -
调用
titleForHeader
(这不知何故给了标题默认的高度,如果它没有一个)。
如果你没有做这些事情,你将没有标题, viewForHeader
将不会被调用。 那是因为如果没有高度的话,运行时就不会知道如何调整视图的大小,所以不用费力去寻求一个。
closuresrmaddy的答案,我试图隐藏Header视图,并返回0.0f为“tableView:heightForHeaderInSection”和一个0高度视图从tableView:viewForHeaderInSection
。
在tableView:heightForHeaderInSection
,从return 1.0f
改为return 0.0f
后,实际调用了委托方法tableView:viewForHeaderInSection
。
结果我希望的效果,而不必使用“tableView:heightForHeaderInSection”; 但是这可能对其他有问题的人获得“tableView:heightForHeaderInSection”委托方法有用。
给estimatedSectionHeaderHeight
sectionHeaderHeight
和sectionHeaderHeight
值固定我的问题。 例如, self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
您应该实现tableView:heightForHeaderInSection:
并设置标题> 0的高度。
这个委托方法和viewForHeaderInSection:
方法一起使用。
我希望这有帮助。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 40; }
我刚才遇到了iOS 7.1的头文件没有显示的问题,但是在我testing过的更新的版本中工作正常,显然是8.1和8.4。
对于完全相同的代码,7.1并没有调用任何的段头tableView:viewForHeaderInSection:
方法,包括: tableView:heightForHeaderInSection:
和tableView:viewForHeaderInSection:
经过实验后,我发现从我的viewDidLoad
中删除这行代码重新显示为7.1,并没有影响我testing的其他版本:
// _Removing_ this line _fixed_ headers on 7.1 self.tableView.estimatedSectionHeaderHeight = 80;
…所以,至less在7.1这里似乎有一些冲突。
值得一提的是,如果你实现tableView:heightForHeaderInSection:
返回UITableViewAutomaticDimension
,那么tableView:viewForHeaderInSection:
将不会被调用。
UITableViewAutomaticDimension
假定将使用一个标准的UITableViewHeaderFooterView
,它使用委托方法tableView:titleForHeaderInSection:
来填充。
从UITableView.h
注释:
从
tableView:heightForHeaderInSection:
或tableView:heightForFooterInSection:
返回此值将产生一个适合从tableView:titleForHeaderInSection:
返回的值的高度tableView:titleForHeaderInSection:
或tableView:titleForFooterInSection:
如果标题不为零。
我从Swift 2项目中将以下两个方法剪切并粘贴到Swift 3项目中,这些项目从未被调用,因为在Swift 3中,这些方法必须在第一个参数名称之前有“ – ”。
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 44.0 } func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: B2BTrolleyHeaderFooterView.reuseIdentifier) as! B2BTrolleyHeaderFooterView return headerView }
有时在viewWillAppear:
或viewDidAppear:
方法中设置tableview.delegate
或datasource = nil
可能导致此问题。 确保不要这样做…