UITableView:viewForHeaderInSection:在reloadData期间未调用:

时间:2013-02-25 23:44:15

标签: ios uitableview uitableviewsectionheader

我已经使用正确的委托和数据源链接设置了tableview .. reloadData方法调用除viewForHeaderInSection:之外的数据源和委托方法。

为什么会这样?

16 个答案:

答案 0 :(得分:237)

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

答案 1 :(得分:37)

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

这意味着:

  • 如果您实施这些方法,只能将自己指定为 dataSource的{​​{1}},你的 UITableView实施将被忽略。

  • tableView:viewForHeaderInSection具有更高的优先级。如果你 实现这两种方法并将自己指定为两者 你会tableView:viewForHeaderInSectiondataSource的{​​{1}} 返回部分标题的视图,但你的 delegate将被忽略。

我也尝试删除UITableView;它运作良好,似乎并没有影响上述程序。但文档说明tableView:titleForHeaderInSection:需要正常工作;为了安全起见,实施这一点也是明智之举。

答案 2 :(得分:25)

@rmaddy错误地说明了这条规则,两次:实际上,tableView:viewForHeaderInSection: 要求您同时实施tableView:heightForHeaderInSection:,同时调用titleForHeader也是完全可以的{1}}和viewForHeader。我将正确地说明规则只是为了记录:

规则很简单,除非你以某种方式给标题增加高度,否则不会调用viewForHeader。您可以通过以下三种方式进行组合:

  • 实施tableView:heightForHeaderInSection:

  • 设置表格sectionHeaderHeight

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

如果您没有执行任何操作,则表示您没有标题,并且viewForHeader无法调用。那是因为没有高度,运行时不知道如何调整视图的大小,所以它并不需要请求。

答案 3 :(得分:19)

提供estimatedSectionHeaderHeightsectionHeaderHeight值可解决我的问题。 例如。, 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;
}

虽然我有选中这两个选项

  1. 自动高度计算
  2. 自动估算高度计算
  3. 苹果说,

    来自故事板,但我仍然遇到了这个奇怪的错误。

    请注意:此错误仅在 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.delegatedatasource = 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
}