ios UITableView : viewForHeaderInSection: 在 reloadData 期间未调用:
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15078725/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
UITableView : viewForHeaderInSection: not called during reloadData:
提问by inforeqd
I've set up the tableview with correct delegate and datasource linkages.. the reloadData method calls the datasource and the delegate methods except for viewForHeaderInSection:
.
我已经使用正确的委托和数据源链接设置了 tableview.. reloadData 方法调用数据源和委托方法,除了viewForHeaderInSection:
.
Why is that so?
为什么呢?
回答by rmaddy
The use of tableView:viewForHeaderInSection:
requires that you also implement tableView:heightForHeaderInSection:
. This should return an appropriate non-zero height for the header. Also make sure you do not also implement the tableView:titleForHeaderInSection:
. You should only use one or the other (viewForHeader
or titleForHeader
).
的使用tableView:viewForHeaderInSection:
要求您还实现tableView:heightForHeaderInSection:
. 这应该为标题返回一个适当的非零高度。还要确保您没有同时实现tableView:titleForHeaderInSection:
. 您应该只使用其中一种(viewForHeader
或titleForHeader
)。
回答by Yunus Nedim Mehel
The trick is that those two methods belong to different UITableView
protocols: tableView:titleForHeaderInSection:
is a UITableViewDataSource
protocol method, where tableView:viewForHeaderInSection
belongs to UITableViewDelegate
.
诀窍是这两个方法属于不同的UITableView
协议:tableView:titleForHeaderInSection:
是一个UITableViewDataSource
协议方法,其中tableView:viewForHeaderInSection
属于UITableViewDelegate
.
That means:
这意味着:
If you implement the methods but assign yourself only as the
dataSource
for theUITableView
, yourtableView:viewForHeaderInSection
implementation will be ignored.tableView:viewForHeaderInSection
has a higher priority. If you implement both of the methods and assign yourself as both thedataSource
and thedelegate
for theUITableView
, you will return the views for section headers but yourtableView:titleForHeaderInSection:
will be ignored.
如果您实现了这些方法,但仅将自己指定为
dataSource
forUITableView
,则您的tableView:viewForHeaderInSection
实现将被忽略。tableView:viewForHeaderInSection
具有更高的优先级。如果您实现这两种方法并将自己指定为 thedataSource
和 thedelegate
forUITableView
,您将返回部分标题的视图,但您的tableView:titleForHeaderInSection:
将被忽略。
I have also tried removing tableView:heightForHeaderInSection:
; it worked fine and didn't seem to affect the procedures above. But the documentation says that it is required for the tableView:viewForHeaderInSection
to work correctly; so to be safe it is wise to implement this, as well.
我也试过删除tableView:heightForHeaderInSection:
; 它工作正常,似乎没有影响上述程序。但是文档说它是tableView:viewForHeaderInSection
正常工作所必需的;所以为了安全起见,实现这一点也是明智的。
回答by matt
@rmaddy has misstated the rule, twice: in reality, tableView:viewForHeaderInSection:
does notrequire that you also implement tableView:heightForHeaderInSection:
, and also it is perfectly fine to call both titleForHeader
and viewForHeader
. I will state the rule correctly just for the record:
@rmaddy说错了规则,两次:在现实中,tableView:viewForHeaderInSection:
它不是要求您还实现了tableView:heightForHeaderInSection:
,而且它是完全没有同时调用titleForHeader
和viewForHeader
。我将正确陈述规则,仅供记录:
The rule is simply that viewForHeader
will not be called unless you somehow give the header a height. You can do this in any combination of three ways:
规则很简单,viewForHeader
除非你以某种方式给标题一个高度,否则不会被调用。您可以通过以下三种方式的任意组合来执行此操作:
Implement
tableView:heightForHeaderInSection:
.Set the table's
sectionHeaderHeight
.Call
titleForHeader
(this somehow gives the header a default height if it doesn't otherwise have one).
实施
tableView:heightForHeaderInSection:
。设置表的
sectionHeaderHeight
.调用
titleForHeader
(如果标题没有其他高度,则以某种方式为标题提供默认高度)。
If you do none of those things, you'll have no headers and viewForHeader
won't be called. That's because without a height, the runtime won't know how to resize the view, so it doesn't bother to ask for one.
如果你什么都不做,你就没有标题,viewForHeader
也不会被调用。这是因为如果没有高度,运行时将不知道如何调整视图的大小,所以它不会费心去要求一个。
回答by Sharukh Mastan
Giving estimatedSectionHeaderHeight
and sectionHeaderHeight
values fixed my problem.
e.g.,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
给予estimatedSectionHeaderHeight
和sectionHeaderHeight
价值观解决了我的问题。例如,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
回答by rrrrrraul
Going off rmaddy 's answer, I was trying to hide the Header view and was returning 0.0f for "tableView:heightForHeaderInSection" and a 0 height View from tableView:viewForHeaderInSection
.
离开 rmaddy 的回答,我试图隐藏 Header 视图并为“tableView:heightForHeaderInSection”返回 0.0f 和从tableView:viewForHeaderInSection
.
After changing from return 1.0f
to return 0.0f
in tableView:heightForHeaderInSection
, the delegate method tableView:viewForHeaderInSection
was indeed called.
从return 1.0f
到return 0.0f
in 之后tableView:heightForHeaderInSection
,委托方法tableView:viewForHeaderInSection
确实被调用了。
Turns out my desired effect works without having to use "tableView:heightForHeaderInSection"; but this may be useful to others who are having an issue getting "tableView:heightForHeaderInSection" delegate method called.
结果我想要的效果无需使用“tableView:heightForHeaderInSection”;但这对于在调用“tableView:heightForHeaderInSection”委托方法时遇到问题的其他人可能很有用。
回答by Benjohn
It's worth briefly noting that if your implementation of tableView:heightForHeaderInSection:
returns UITableViewAutomaticDimension
, then tableView:viewForHeaderInSection:
will not be called.
值得注意的是,如果您执行了tableView:heightForHeaderInSection:
return UITableViewAutomaticDimension
,则tableView:viewForHeaderInSection:
不会被调用。
UITableViewAutomaticDimension
assumes that a standard UITableViewHeaderFooterView
will be used that is populated with the delegate method tableView:titleForHeaderInSection:
.
UITableViewAutomaticDimension
假定UITableViewHeaderFooterView
将使用填充了委托方法的标准tableView:titleForHeaderInSection:
。
From comments in the UITableView.h
:
来自以下评论UITableView.h
:
Returning this value from
tableView:heightForHeaderInSection:
ortableView:heightForFooterInSection:
results in a height that fits the value returned fromtableView:titleForHeaderInSection:
ortableView:titleForFooterInSection:
if the title is not nil.
从
tableView:heightForHeaderInSection:
或返回此值会tableView:heightForFooterInSection:
导致高度适合从tableView:titleForHeaderInSection:
或tableView:titleForFooterInSection:
如果标题不为零的返回值。
回答by Chiara
You should implement tableView:heightForHeaderInSection:
and set the height for the header >0.
您应该实现tableView:heightForHeaderInSection:
并设置标题 >0 的高度。
This delegate method goes along with the viewForHeaderInSection:
method.
此委托方法与viewForHeaderInSection:
方法一起使用。
I hope this helps.
我希望这有帮助。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
回答by Benjohn
I've just had an issue with headers not showing for iOS 7.1, but working fine with later releases I have tested, explicitly with 8.1 and 8.4.
我刚刚遇到了标题未在iOS 7.1 中显示的问题,但在我测试过的更高版本中运行良好,明确使用 8.1 和 8.4。
For the exact same code, 7.1 was notcalling any of the section header delegate methods at all, including: tableView:heightForHeaderInSection:
and tableView:viewForHeaderInSection:
.
对于完全相同的代码,7.1根本没有调用任何节头委托方法,包括:tableView:heightForHeaderInSection:
和tableView:viewForHeaderInSection:
。
After experimentation, I found that removingthis line from my viewDidLoad
made headers re-appear for 7.1 and did not impact other versions I tested:
经过实验,我发现从我制作的标题中删除这一行viewDidLoad
会在 7.1 中重新出现,并且不会影响我测试的其他版本:
// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;
… so, there seems to be some kind of conflict there for 7.1, at least.
……所以,至少 7.1 似乎存在某种冲突。
回答by Najam
Same issue occured with me but as I was using automatic height calculationfrom xCode 9, I cannot give any explicit height value as mentioned above. After some experimentation I got solution, we have to override this method as,
同样的问题发生在我身边但是,因为我是用自动高度计算从Xcode中9,如上面提到的,我不能给任何明确的高度值。经过一些实验,我得到了解决方案,我们必须重写这个方法,
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
Although I have checkedboth options
虽然我已经检查了两个选项
- Automatic Height Calculation
- Automatic Estimated Height Calculation
- 自动高度计算
- 自动估计高度计算
from storyboardas apple says, but still I got this weird error.
来自苹果所说的故事板,但我仍然遇到了这个奇怪的错误。
Please Note: This Error was shown only on IOS-10version not on IOS-11version. Maybe it's a bug from xCode. Thanks
请注意:此错误仅在IOS-10版本上显示,而不在IOS-11版本上显示。也许这是来自 xCode 的错误。谢谢
回答by RanLearns
Here's what I've found (Swift 4) (thanks to this commenton another question)
这是我发现的(Swift 4)(感谢对另一个问题的评论)
Whether I used titleForHeaderInSection or viewForHeaderInSection - it wasn't that they weren't getting called when the tableview was scrolled and new cells were being loaded, but any font choices I made for the headerView's textLabel were only appearing on what was initially visible on load, and not as the table was scrolled.
无论我是使用 titleForHeaderInSection 还是 viewForHeaderInSection - 并不是在滚动 tableview 和加载新单元格时它们没有被调用,而是我为 headerView 的 textLabel 所做的任何字体选择只出现在加载时最初可见的内容上,而不是滚动表格。
The fix was willDisplayHeaderView:
修复方法是 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)
}
}