我已经使用正确的委托和数据源链接设置了表视图。.除 viewForHeaderInSection:之外,reloadData 方法调用数据源和委托方法。
viewForHeaderInSection:
为什么会这样?
使用 tableView:viewForHeaderInSection:还需要实现 tableView:heightForHeaderInSection:。这应该为标头返回一个适当的非零高度。还要确保您没有同时实现 tableView:titleForHeaderInSection:。您应该只使用其中一个(viewForHeader或 titleForHeader)。
tableView:viewForHeaderInSection:
tableView:heightForHeaderInSection:
tableView:titleForHeaderInSection:
viewForHeader
titleForHeader
诀窍在于这两种方法属于不同的 UITableView协议: tableView:titleForHeaderInSection:是 UITableViewDataSource协议方法,其中 tableView:viewForHeaderInSection属于 UITableViewDelegate。
UITableView
UITableViewDataSource
tableView:viewForHeaderInSection
UITableViewDelegate
这意味着:
如果您实现了这些方法,但仅将自己分配为 dataSource代表 UITableView 将忽略 tableView:viewForHeaderInSection的实现
dataSource
tableView:viewForHeaderInSection有更高的优先级。如果你 实现这两个方法,并将自己分配为 dataSource和 delegate代表 UITableView 返回节标题的视图,但是 将忽略 tableView:titleForHeaderInSection:
delegate
我也试过移除 tableView:heightForHeaderInSection:,它工作良好,似乎没有影响上述程序。但是文档说,tableView:viewForHeaderInSection需要正确工作; 因此,为了安全起见,也应该实现这一点。
@ rmaddy 两次错误地陈述了这个规则: 实际上,tableView:viewForHeaderInSection:要求 没有也实现 tableView:heightForHeaderInSection:,而且调用 titleForHeader和 viewForHeader也是完全可以的。我将正确地陈述规则,以便记录在案:
规则很简单,viewForHeader将不会被调用,除非您以某种方式给标题一个高度。你可以通过三种方式的任意组合来实现这一点:
实现 tableView:heightForHeaderInSection:。
把桌子摆成 sectionHeaderHeight。
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,并没有影响其他版本我测试:
viewDidLoad
// _Removing_ this line _fixed_ headers on 7.1 self.tableView.estimatedSectionHeaderHeight = 80;
... 所以,至少7.1% 的人会有冲突。
值得一提的是,如果您的 tableView:heightForHeaderInSection:实现返回 UITableViewAutomaticDimension,那么将不会调用 tableView:viewForHeaderInSection:。
UITableViewAutomaticDimension
UITableViewAutomaticDimension假设将使用一个标准的 UITableViewHeaderFooterView,该 UITableViewHeaderFooterView由委托方法 tableView:titleForHeaderInSection:填充。
UITableViewHeaderFooterView
来自 UITableView.h的评论:
UITableView.h
如果标题不为空,则从 tableView:heightForHeaderInSection:或 tableView:heightForFooterInSection:返回此值将导致与从 tableView:titleForHeaderInSection:或 tableView:titleForFooterInSection:返回的值相匹配的高度。
tableView:heightForFooterInSection:
tableView:titleForFooterInSection:
有时在 viewWillAppear:或 viewDidAppear:方法中设置 tableview.delegate或 datasource = nil会导致这个问题。千万别这么做。
viewWillAppear:
viewDidAppear:
tableview.delegate
datasource = nil
关闭 rmaddy 的回答,我试图隐藏 Header 视图,返回“ tableView: heightForHeaderInSection”的0.0 f 和来自 tableView:viewForHeaderInSection的0高度视图。
在 tableView:heightForHeaderInSection中从 return 1.0f更改为 return 0.0f后,确实调用了委托方法 tableView:viewForHeaderInSection。
tableView:heightForHeaderInSection
return 1.0f
return 0.0f
原来我想要的效果不需要使用“ tableView: heightForHeaderInSection”; 但是这对于那些在获取“ tableView: heightForHeaderInSection”委托方法时遇到问题的人可能很有用。
给 estimatedSectionHeaderHeight和 sectionHeaderHeight值解决了我的问题。 例如: EstiatedSectionHeaderHeight = 100 SectionHeaderHeight = UITableViewAutomatic維度
estimatedSectionHeaderHeight
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; }
虽然我有 检查过了两个选项
就像苹果说的那样,但我还是得到了这个奇怪的错误。
请注意 : 此错误仅在 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中的单元格
UITableviewCell
viewForHeaderInSection
return cell
把这个改成
return cell.contentView
对我有用。
对我来说
是在一个很远的派生类中实现的,而这个派生类并不需要进入超类。
viewForHeaderInSection没有被召回的原因有两个:
要么你没有设置你的 UITableViewDelegate,或者 你的 UITableViewDelegate设置不正确。
就我而言,这是因为我没有实施:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat