UITableView:viewForHeaderInSection:在reloadData过程中没有调用:

我已经build立了正确的委托和数据源链接的tableview .. reloadData方法调用除了viewForHeaderInSection之外的数据源和委托方法:..

为什么?

使用tableView:viewForHeaderInSection:要求你也实现tableView:heightForHeaderInSection: tableView:viewForHeaderInSection: 这应该返回一个适当的非零高度的标题。 还要确保你不要实现tableView:titleForHeaderInSection: 你应该只使用其中一个( viewForHeadertitleForHeader )。

诀窍是这两个方法属于不同的UITableView协议:

tableView:titleForHeaderInSection:是一个UITableViewDataSource协议方法,其中tableView:viewForHeaderInSection属于协议UITableViewDelegate (我不知道为什么,有什么意见?)

这意味着

  1. 如果你实现的方法,但只分配自己作为UITableViewdataSource ,你的tableView:viewForHeaderInSection实现将被忽略,将永远不会被调用。

  2. tableView:viewForHeaderInSection具有更高的优先级。 如果你实现了这两个方法,并将自己指定为UITableViewdataSourcedelegate ,则将返回节标题的视图,但是您的tableView:titleForHeaderInSection:将被忽略。

  3. 出于研究目的,我已经删除了我的tableView:heightForHeaderInSection: 它运行良好,似乎并没有影响上述程序。 但是注释文档指出tableView:viewForHeaderInSection需要正确的工作; 所以为了安全起见,这是明智的。

@rmaddy错误地规定了两次:实际上, tableView:viewForHeaderInSection:并不要求你也实现了tableView:heightForHeaderInSection: titleForHeader同时调用titleForHeaderviewForHeader也是非常好的。 我将正确地陈述规则只是为了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 sectionHeaderHeightsectionHeaderHeight值固定我的问题。 例如, 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.delegatedatasource = nil可能导致此问题。 确保不要这样做…