UITableView: viewForHeaderInSection: 在 reloadData 期间未调用:

我已经使用正确的委托和数据源链接设置了表视图。.除 viewForHeaderInSection:之外,reloadData 方法调用数据源和委托方法。

为什么会这样?

62847 次浏览

使用 tableView:viewForHeaderInSection:还需要实现 tableView:heightForHeaderInSection:。这应该为标头返回一个适当的非零高度。还要确保您没有同时实现 tableView:titleForHeaderInSection:。您应该只使用其中一个(viewForHeadertitleForHeader)。

诀窍在于这两种方法属于不同的 UITableView协议: tableView:titleForHeaderInSection:UITableViewDataSource协议方法,其中 tableView:viewForHeaderInSection属于 UITableViewDelegate

这意味着:

  • 如果您实现了这些方法,但仅将自己分配为 dataSource代表 UITableView 将忽略 tableView:viewForHeaderInSection的实现

  • tableView:viewForHeaderInSection有更高的优先级。如果你 实现这两个方法,并将自己分配为 dataSourcedelegate代表 UITableView 返回节标题的视图,但是 将忽略 tableView:titleForHeaderInSection:

我也试过移除 tableView:heightForHeaderInSection:,它工作良好,似乎没有影响上述程序。但是文档说,tableView:viewForHeaderInSection需要正确工作; 因此,为了安全起见,也应该实现这一点。

@ rmaddy 两次错误地陈述了这个规则: 实际上,tableView:viewForHeaderInSection:要求 没有也实现 tableView:heightForHeaderInSection:,而且调用 titleForHeaderviewForHeader也是完全可以的。我将正确地陈述规则,以便记录在案:

规则很简单,viewForHeader将不会被调用,除非您以某种方式给标题一个高度。你可以通过三种方式的任意组合来实现这一点:

  • 实现 tableView:heightForHeaderInSection:

  • 把桌子摆成 sectionHeaderHeight

  • 调用 titleForHeader(如果头部没有默认高度,这会以某种方式给它一个默认高度)。

如果不执行这些操作,则不会有头部,也不会调用 viewForHeader。这是因为如果没有高度,运行时就不知道如何调整视图的大小,所以它不会费心去要求一个高度。

您应该实现 tableView:heightForHeaderInSection:并设置头部 > 0的高度。

此委托方法与 viewForHeaderInSection:方法一起使用。

希望这个能帮上忙。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}

我只是遇到了一个问题,没有在 IOS 7.1中显示标题,但是在我测试过的后续版本中可以很好地工作,显式地使用8.1和8.4。

对于完全相同的代码,7.1是 没有调用任何节头委托方法,包括: tableView:heightForHeaderInSection:tableView:viewForHeaderInSection:

经过实验,我发现 移除这一行从我的 viewDidLoad使标题重新出现在7.1,并没有影响其他版本我测试:

// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;

... 所以,至少7.1% 的人会有冲突。

值得一提的是,如果您的 tableView:heightForHeaderInSection:实现返回 UITableViewAutomaticDimension,那么将不会调用 tableView:viewForHeaderInSection:

UITableViewAutomaticDimension假设将使用一个标准的 UITableViewHeaderFooterView,该 UITableViewHeaderFooterView由委托方法 tableView:titleForHeaderInSection:填充。

来自 UITableView.h的评论:

如果标题不为空,则从 tableView:heightForHeaderInSection:tableView:heightForFooterInSection:返回此值将导致与从 tableView:titleForHeaderInSection:tableView:titleForFooterInSection:返回的值相匹配的高度。

有时在 viewWillAppear:viewDidAppear:方法中设置 tableview.delegatedatasource = nil会导致这个问题。千万别这么做。

关闭 rmaddy 的回答,我试图隐藏 Header 视图,返回“ tableView: heightForHeaderInSection”的0.0 f 和来自 tableView:viewForHeaderInSection的0高度视图。

tableView:heightForHeaderInSection中从 return 1.0f更改为 return 0.0f后,确实调用了委托方法 tableView:viewForHeaderInSection

原来我想要的效果不需要使用“ tableView: heightForHeaderInSection”; 但是这对于那些在获取“ tableView: heightForHeaderInSection”委托方法时遇到问题的人可能很有用。

estimatedSectionHeaderHeightsectionHeaderHeight值解决了我的问题。 例如: EstiatedSectionHeaderHeight = 100 SectionHeaderHeight = UITableViewAutomatic維度

我剪切和粘贴了以下两个方法从一个 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
}

同样的问题也发生在我身上,但是由于我使用的是来自 代码9自动计算高度自动计算高度,所以我不能给出上面提到的任何显式高度值。经过一些实验,我 有办法了,我们必须覆盖这个方法,

-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}

虽然我有 检查过了两个选项

  1. 自动计算高度
  2. 自动估计高度计算

就像苹果说的那样,但我还是得到了这个奇怪的错误。

请注意 : 此错误仅在 IOS-10版本中显示,而在 IOS-11版本中没有显示。也许是 xCode 的 bug。谢谢

以下是我的发现(Swift 4) (感谢 此评论关于另一个问题)

无论我是使用 titleForHeaderInSection 还是 viewForHeaderInSection ——当表格视图滚动或者加载新单元格时,并不是没有调用它们,而是我为 headerView 的 textLabel 选择的任何字体都只出现在加载时最初可见的部分,而不是滚动表格时。

解决方案是 will DisplayHeaderView:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
if let header = view as? UITableViewHeaderFooterView {
header.textLabel?.font = UIFont(name: yourFont, size: 42)
}
}

在我的例子中,我使用 UITableviewCell创建了头视图,并像这样返回了 viewForHeaderInSection中的单元格

return cell

把这个改成

return cell.contentView

对我有用。

对我来说

viewForHeaderInSection

是在一个很远的派生类中实现的,而这个派生类并不需要进入超类。

viewForHeaderInSection没有被召回的原因有两个:

要么你没有设置你的 UITableViewDelegate,或者 你的 UITableViewDelegate设置不正确。

就我而言,这是因为我没有实施:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat