131

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

为什么呢?

4

16 回答 16

264

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

于 2013-02-25T23:51:41.983 回答
42

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

这意味着:

  • 如果您实现方法但仅将自己指定为 dataSourcefor UITableView,您的 tableView:viewForHeaderInSection实现将被忽略。

  • tableView:viewForHeaderInSection具有更高的优先级。如果您实现这两种方法并将自己指定为 the dataSource和 the delegateUITableView您将返回节标题的视图,但您的 tableView:titleForHeaderInSection:将被忽略。

我也试过删除tableView:heightForHeaderInSection:;它工作正常,似乎没有影响上述程序。但是文档说它是tableView:viewForHeaderInSection正常工作所必需的;所以为了安全起见,实施这一点也是明智之举。

于 2014-06-12T07:55:17.307 回答
28

@rmaddy 两次错误地陈述了该规则:实际上,tableView:viewForHeaderInSection:不需要您也实施而且同时调用andtableView:heightForHeaderInSection:也很好。我将正确地说明规则以供记录:titleForHeaderviewForHeader

规则很简单,viewForHeader除非您以某种方式给标题指定高度,否则不会调用它。您可以通过以下三种方式的任意组合来执行此操作:

  • 实施tableView:heightForHeaderInSection:

  • 设置表的sectionHeaderHeight.

  • 调用titleForHeader(如果标题没有默认高度,这会以某种方式为标题提供默认高度)。

如果你不做这些事情,你将没有标题,viewForHeader也不会被调用。那是因为没有高度,运行时将不知道如何调整视图的大小,所以它不会费心去要求一个。

于 2014-10-02T15:14:50.253 回答
23

给予estimatedSectionHeaderHeightsectionHeaderHeight价值观解决了我的问题。例如, self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension

于 2017-03-08T21:22:33.393 回答
7

离开 rmaddy 的回答,我试图隐藏 Header 视图,并为 "tableView:heightForHeaderInSection" 返回 0.0f 和从tableView:viewForHeaderInSection.

从更改return 1.0freturn 0.0fin后,确实调用tableView:heightForHeaderInSection了委托方法。tableView:viewForHeaderInSection

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

于 2015-10-05T21:56:26.800 回答
6

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

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

我希望这有帮助。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
         return 40;
}
于 2015-02-20T10:57:59.367 回答
5

值得注意的是,如果您实现了return , thentableView:heightForHeaderInSection:将不会被调用。UITableViewAutomaticDimensiontableView:viewForHeaderInSection:

UITableViewAutomaticDimension假定UITableViewHeaderFooterView将使用使用委托方法填充的标准tableView:titleForHeaderInSection:

从评论中UITableView.h

如果标题不为零,则返回此值tableView:heightForHeaderInSection:tableView:heightForFooterInSection:导致适合返回值的高度。tableView:titleForHeaderInSection:tableView:titleForFooterInSection:

于 2015-07-24T11:41:09.087 回答
3

我刚刚遇到了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 似乎存在某种冲突。

于 2015-07-22T08:56:22.197 回答
3

我也遇到了同样的问题,但是当我使用xCode 9的自动高度计算时,我无法给出上面提到的任何明确的高度值。经过一些实验,我得到了解决方案,我们必须重写这个方法,

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

虽然我已经检查了两个选项

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

正如苹果所说,来自故事板,但我仍然遇到了这个奇怪的错误。

请注意:此错误仅在IOS-10版本上显示,而不在IOS-11版本上显示。也许这是来自 xCode 的错误。谢谢

于 2017-11-23T07:30:59.843 回答
1

viewForHeaderInSection没有被调用的原因是以下两个原因之一:

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

于 2019-12-05T20:22:15.410 回答
0

这是我发现的(Swift 4)(感谢对另一个问题的评论)

无论我使用的是 titleForHeaderInSection 还是 viewForHeaderInSection - 并不是在滚动 tableview 并加载新单元格时它们没有被调用,而是我为 headerView 的 textLabel 所做的任何字体选择都只出现在加载时最初可见的内容上,而不是在表格滚动时。

修复是 willDisplayHeaderView:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let header = view as? UITableViewHeaderFooterView {
        header.textLabel?.font = UIFont(name: yourFont, size: 42)
    }
}
于 2018-09-22T14:39:31.570 回答
0

在我的情况下,我已经创建了标题视图,并像这样UITableviewCell返回单元格viewForHeaderInSection

return cell

将其更改为

return cell.contentView 

为我工作。

于 2019-10-15T10:57:32.720 回答
0

就我而言

viewForHeaderInSection

是在一个很远的派生类中实现的,它不会打扰到超类。

于 2019-10-30T13:04:47.667 回答
0

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

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
于 2020-07-27T06:34:12.980 回答
-1

有时在or方法中设置tableview.delegateor可能会导致此问题。确保不要这样做...datasource = nilviewWillAppear:viewDidAppear:

于 2015-08-06T16:03:32.207 回答
-1

我已将以下两种方法从 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
}
于 2017-05-15T00:11:40.143 回答