我已经使用正确的委托和数据源链接设置了表格视图。reloadData 方法调用数据源和委托方法,但viewForHeaderInSection:
.
为什么呢?
我已经使用正确的委托和数据源链接设置了表格视图。reloadData 方法调用数据源和委托方法,但viewForHeaderInSection:
.
为什么呢?
的使用tableView:viewForHeaderInSection:
要求您还实现tableView:heightForHeaderInSection:
. 这应该为标题返回一个适当的非零高度。还要确保您没有同时实施tableView:titleForHeaderInSection:
. 您应该只使用其中一个(viewForHeader
或titleForHeader
)。
诀窍是这两种方法属于不同的UITableView
协议:tableView:titleForHeaderInSection:
是UITableViewDataSource
协议方法,其中tableView:viewForHeaderInSection
属于UITableViewDelegate
.
这意味着:
如果您实现方法但仅将自己指定为
dataSource
for UITableView
,您的
tableView:viewForHeaderInSection
实现将被忽略。
tableView:viewForHeaderInSection
具有更高的优先级。如果您实现这两种方法并将自己指定为 the
dataSource
和 the delegate
,UITableView
您将返回节标题的视图,但您的
tableView:titleForHeaderInSection:
将被忽略。
我也试过删除tableView:heightForHeaderInSection:
;它工作正常,似乎没有影响上述程序。但是文档说它是tableView:viewForHeaderInSection
正常工作所必需的;所以为了安全起见,实施这一点也是明智之举。
@rmaddy 两次错误地陈述了该规则:实际上,tableView:viewForHeaderInSection:
不需要您也实施,而且同时调用andtableView:heightForHeaderInSection:
也很好。我将正确地说明规则以供记录:titleForHeader
viewForHeader
规则很简单,viewForHeader
除非您以某种方式给标题指定高度,否则不会调用它。您可以通过以下三种方式的任意组合来执行此操作:
实施tableView:heightForHeaderInSection:
。
设置表的sectionHeaderHeight
.
调用titleForHeader
(如果标题没有默认高度,这会以某种方式为标题提供默认高度)。
如果你不做这些事情,你将没有标题,viewForHeader
也不会被调用。那是因为没有高度,运行时将不知道如何调整视图的大小,所以它不会费心去要求一个。
给予estimatedSectionHeaderHeight
和sectionHeaderHeight
价值观解决了我的问题。例如,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
离开 rmaddy 的回答,我试图隐藏 Header 视图,并为 "tableView:heightForHeaderInSection" 返回 0.0f 和从tableView:viewForHeaderInSection
.
从更改return 1.0f
为return 0.0f
in后,确实调用tableView:heightForHeaderInSection
了委托方法。tableView:viewForHeaderInSection
原来我想要的效果不需要使用“tableView:heightForHeaderInSection”;但这对于在调用“tableView:heightForHeaderInSection”委托方法时遇到问题的其他人可能很有用。
您应该实现tableView:heightForHeaderInSection:
并设置标题 > 0 的高度。
此委托方法与方法一起使用viewForHeaderInSection:
。
我希望这有帮助。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
值得注意的是,如果您实现了return , thentableView:heightForHeaderInSection:
将不会被调用。UITableViewAutomaticDimension
tableView:viewForHeaderInSection:
UITableViewAutomaticDimension
假定UITableViewHeaderFooterView
将使用使用委托方法填充的标准tableView:titleForHeaderInSection:
。
从评论中UITableView.h
:
如果标题不为零,则返回此值
tableView:heightForHeaderInSection:
或tableView:heightForFooterInSection:
导致适合返回值的高度。tableView:titleForHeaderInSection:
tableView:titleForFooterInSection:
我刚刚遇到了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 似乎存在某种冲突。
我也遇到了同样的问题,但是当我使用xCode 9的自动高度计算时,我无法给出上面提到的任何明确的高度值。经过一些实验,我得到了解决方案,我们必须重写这个方法,
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
虽然我已经检查了两个选项
正如苹果所说,来自故事板,但我仍然遇到了这个奇怪的错误。
请注意:此错误仅在IOS-10版本上显示,而不在IOS-11版本上显示。也许这是来自 xCode 的错误。谢谢
viewForHeaderInSection
没有被调用的原因是以下两个原因之一:
要么你没有设置你的UITableViewDelegate
,要么你设置UITableViewDelegate
不正确。
这是我发现的(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)
}
}
在我的情况下,我已经创建了标题视图,并像这样UITableviewCell
返回单元格viewForHeaderInSection
return cell
将其更改为
return cell.contentView
为我工作。
就我而言
viewForHeaderInSection
是在一个很远的派生类中实现的,它不会打扰到超类。
就我而言,这是因为我没有实施:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
有时在or方法中设置tableview.delegate
or可能会导致此问题。确保不要这样做...datasource = nil
viewWillAppear:
viewDidAppear:
我已将以下两种方法从 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
}