的UITableView:viewForHeaderInSection:reloadData时不叫:

2019-07-20 13:23发布

我已经设置了正确的委托和数据源联系的实现代码如下..的reloadData方法调用的数据源和除委托方法viewForHeaderInSection:

为什么会这样?

Answer 1:

采用tableView:viewForHeaderInSection:要求您还实现了tableView:heightForHeaderInSection: 这应该返回一个适当的非零高度的头部。 另外,还要确保你不也实现了tableView:titleForHeaderInSection: 您应该只使用一个或另一个( viewForHeadertitleForHeader )。



Answer 2:

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

这意味着:

  1. 如果要实现的方法,但指定自己只作为dataSourceUITableViewtableView:viewForHeaderInSection你的执行将被忽略,不会被调用。

  2. tableView:viewForHeaderInSection具有更高的优先级。 如果你同时实现的方法和分配自己作为两个dataSourcedelegateUITableView ,你将返回节头,但你的意见tableView:titleForHeaderInSection:将被忽略。

  3. 出于研究目的,我已删除了我tableView:heightForHeaderInSection: ; 它工作得很好,似乎不影响上述过程。 但是,评论文档指出,它是必需的tableView:viewForHeaderInSection正常工作; 因此为了安全起见明智的做法是实现这一点。



Answer 3:

@rmaddy说错了规则,两次:在现实中, tableView:viewForHeaderInSection: 不需要 ,你还实现了tableView:heightForHeaderInSection:而且它是完全没有同时调用titleForHeaderviewForHeader 。 我会正确地陈述规则仅仅是为了记录:

规则很简单,就是viewForHeader将不会被调用,除非你以某种方式给头部的高度。 您可以通过以下三种方式的任意组合做到这一点:

  • 实施tableView:heightForHeaderInSection:

  • 设置表格的sectionHeaderHeight

  • 呼叫titleForHeader (这在某种程度上使头默认高度,如果它不以其他方式之一)。

如果你没有这些东西,你就没有头和viewForHeader不会被调用。 这是因为没有一个高度,运行时将不知道如何调整视图大小,所以它不会刻意去要求一个。



Answer 4:

给予estimatedSectionHeaderHeightsectionHeaderHeight值固定我的问题。 例如, self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension



Answer 5:

去关rmaddy的回答,我试图隐藏标题视图和返航0.0F‘的tableView:heightForHeaderInSection’,并从0高度查看tableView:viewForHeaderInSection

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

原来我想要的效果的作品,而不必使用“的tableView:heightForHeaderInSection”; 但是这可能是给其他人谁是有一个问题让“的tableView:heightForHeaderInSection”有用的委托方法调用。



Answer 6:

值得一提的简单,如果你的执行tableView:heightForHeaderInSection:返回UITableViewAutomaticDimension ,然后tableView:viewForHeaderInSection:不会被调用。

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

从评论UITableView.h

从返回这个值tableView:heightForHeaderInSection:tableView:heightForFooterInSection:结果在适合的价值的高度,从返回tableView:titleForHeaderInSection:tableView:titleForFooterInSection:如果标题不为零。



Answer 7:

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

此委托方法与随之而来viewForHeaderInSection:方法。

我希望这有帮助。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
         return 40;
}


Answer 8:

我刚刚与标题不显示为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,至少。



Answer 9:

同样的问题发生在我身边但是,因为我是用在Xcode 9 自动高度计算 ,如上面提到的,我不能给任何明确的高度值。 经过一番试验我的解决方案 ,我们必须重写此方法,

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

虽然我已检查这两个选项

  1. 自动高度计算
  2. 自动预测的高度计算

故事板作为苹果说,但我仍然得到这个奇怪的错误。

请注意 :此错误是只能显示在IOS-10的版本不是IOS-11版本。 也许这是在Xcode的错误。 谢谢



Answer 10:

下面是我发现( 斯威夫特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)
    }
}


Answer 11:

有时制定tableview.delegatedatasource = nilviewWillAppear:viewDidAppear:方法可能导致此问题。 确保没有做到这一点...



Answer 12:

我剪切和粘贴从斯威夫特2项目的以下两种方法在我的斯威夫特3项目,从来没有因为斯威夫特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
}


文章来源: UITableView : viewForHeaderInSection: not called during reloadData: