我已经使用正确的委托和数据源链接设置了tableview .. reloadData方法调用除viewForHeaderInSection:
之外的数据源和委托方法。
为什么会这样?
答案 0 :(得分:237)
使用tableView:viewForHeaderInSection:
要求您也实施tableView:heightForHeaderInSection:
。这应该为标题返回适当的非零高度。另外,请确保您没有实现tableView:titleForHeaderInSection:
。您应该只使用其中一个(viewForHeader
或titleForHeader
)。
答案 1 :(得分:37)
诀窍是这两种方法属于不同的UITableView
协议:tableView:titleForHeaderInSection:
是一种 UITableViewDataSource
协议方法,其中tableView:viewForHeaderInSection
属于的 UITableViewDelegate
强>
这意味着:
如果您实施这些方法,只能将自己指定为
dataSource
的{{1}},你的
UITableView
实施将被忽略。
tableView:viewForHeaderInSection
具有更高的优先级。如果你
实现这两种方法并将自己指定为两者
你会tableView:viewForHeaderInSection
和dataSource
的{{1}}
返回部分标题的视图,但你的
delegate
将被忽略。
我也尝试删除UITableView
;它运作良好,似乎并没有影响上述程序。但文档说明tableView:titleForHeaderInSection:
需要正常工作;为了安全起见,实施这一点也是明智之举。
答案 2 :(得分:25)
@rmaddy错误地说明了这条规则,两次:实际上,tableView:viewForHeaderInSection:
要求您同时实施tableView:heightForHeaderInSection:
,同时调用titleForHeader
也是完全可以的{1}}和viewForHeader
。我将正确地说明规则只是为了记录:
规则很简单,除非你以某种方式给标题增加高度,否则不会调用viewForHeader
。您可以通过以下三种方式进行组合:
实施tableView:heightForHeaderInSection:
。
设置表格sectionHeaderHeight
。
调用titleForHeader
(如果它没有,则以某种方式为标题提供默认高度。)
如果您没有执行任何操作,则表示您没有标题,并且viewForHeader
无法调用。那是因为没有高度,运行时不知道如何调整视图的大小,所以它并不需要请求。
答案 3 :(得分:19)
提供estimatedSectionHeaderHeight
和sectionHeaderHeight
值可解决我的问题。
例如。,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
答案 4 :(得分:7)
关闭rmaddy的回答,我试图隐藏Header视图,并返回0.0f表示“tableView:heightForHeaderInSection”和0 {view} tableView:viewForHeaderInSection
。
在return 1.0f
中从return 0.0f
更改为tableView:heightForHeaderInSection
后,确实调用了委托方法tableView:viewForHeaderInSection
。
无需使用“tableView:heightForHeaderInSection”即可实现我想要的效果。但是对于那些在调用“tableView:heightForHeaderInSection”委托方法时遇到问题的人来说,这可能是有用的。
答案 5 :(得分:5)
值得简要注意的是,如果tableView:heightForHeaderInSection:
的实施返回UITableViewAutomaticDimension
,则不会调用tableView:viewForHeaderInSection:
。
UITableViewAutomaticDimension
假设将使用使用委托方法UITableViewHeaderFooterView
填充的标准tableView:titleForHeaderInSection:
。
来自UITableView.h
的评论:
如果标题不是nil,则从
tableView:heightForHeaderInSection:
或tableView:heightForFooterInSection:
返回此值会产生适合tableView:titleForHeaderInSection:
或tableView:titleForFooterInSection:
返回值的高度。
答案 6 :(得分:4)
您应该实施tableView:heightForHeaderInSection:
并设置标题> 0的高度。
此委托方法与viewForHeaderInSection:
方法一起使用。
我希望这会有所帮助。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
答案 7 :(得分:3)
我刚刚遇到一个问题,标题没有显示 iOS 7.1 ,但是我已经测试过的版本与8.1和8.4明确地进行了测试。
对于完全相同的代码,7.1 not 根本不会调用任何节标题委托方法,包括:tableView:heightForHeaderInSection:
和tableView:viewForHeaderInSection:
。
经过实验,我发现从viewDidLoad
制作的标题删除这一行会重新显示为7.1并且不影响我测试的其他版本:
// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;
......所以,至少在7.1那里似乎存在某种冲突。
答案 8 :(得分:0)
同样的问题发生在我身上,但是当我使用 xCode 9 中的自动高度计算时,我无法提供任何明确的高度值,如上所述。经过一些实验,我得到了解决方案,我们必须将此方法重写为,
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
虽然我有选中这两个选项
来自故事板,但我仍然遇到了这个奇怪的错误。
请注意:此错误仅在 IOS-10 版本上显示,而不在 IOS-11 版本上显示。也许它是xCode的一个bug。感谢
答案 9 :(得分:0)
这就是我所发现的( Swift 4 ) (感谢this comment的另一个问题)
我是否使用titleForHeaderInSection或viewForHeaderInSection-并不是在滚动表视图和加载新单元格时没有调用它们,但是我为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)
}
}
答案 10 :(得分:0)
对于我来说,我已经使用UITableviewCell
创建了标题视图,并像这样返回viewForHeaderInSection
中的单元格
return cell
将此更改为
return cell.contentView
为我工作。
答案 11 :(得分:0)
就我而言
viewForHeaderInSection
是在很远的派生类中实现的,该派生类不费心将雏菊转换为超类。
答案 12 :(得分:0)
viewForHeaderInSection
未被调用的原因是以下两个原因之一:
您没有设置UITableViewDelegate
,或者
您错误地设置了UITableViewDelegate
。
答案 13 :(得分:0)
在我的情况下,这是因为我没有实现:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
答案 14 :(得分:-1)
有时在tableview.delegate
或datasource = nil
方法中设置viewWillAppear:
或viewDidAppear:
会导致此问题。一定不要这样做......
答案 15 :(得分:-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
}