UITableView reloadSections/reloadData:标题视图变为空白

Posted

技术标签:

【中文标题】UITableView reloadSections/reloadData:标题视图变为空白【英文标题】:UITableView reloadSections/reloadData: header view becomes blank 【发布时间】:2011-12-28 15:56:12 【问题描述】:

我有一个带有一些部分的 UITableView,每个部分都有自己的标题视图。 当用户点击某个部分的标题视图时,该部分的所有行都将折叠。我所做的是,我将该部分的行数设置为0,然后调用:

[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationBottom];

一切都按预期工作,除了一件事:该部分的标题视图变为白色空白。当我滚动表格时,标题再次变得正常。

所以我猜表格的绘制有一些问题。

有趣的是,如果我改用 UITableViewRowAnimationFade,那么即使我滚动表格,标题仍然是空白。

当我只更新一个部分时也没有问题 - 当我更新多个部分时会出现问题。

如果我使用

[self.tableView reloadData]

相反,一切正常。

我使用的原因

[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationBottom];

是因为我想要动画。

使用 beginUpdates / endupdates 包装不起作用。

【问题讨论】:

【参考方案1】:

我意识到这个问题已经很久没有提出了,但我认为下面给出的所有答案都是不正确的。

我遇到了同样的问题(使用其他人的代码),当我意识到代码没有正确重用表头时,我正要被这篇文章愚弄。标题消失是因为代码只提供了一个 UIView,而不是 UITableViewHeaderFooterView,正确注册并设置为重用。

看看这里的答案: How to use UITableViewHeaderFooterView?

当我设置一个可重复使用的标题时,我的空白标题消失了。

【讨论】:

不错的收获 - 现在看起来很明显...... :) @GeneCode Raz 的回答很好地解释了重用过程。 @Darren 感谢您的回答。我在下面添加了一些 Swift 注释 这适用于我在 ios 12 中!我有一个自定义的UITableViewCell,其中 Xib-File 作为标题。有趣的是,我保留了 Xib 的原样,只是创建了 UITableViewHeaderFooterView 的自定义类子类,并更改了表格视图的注册和出队功能,它正在工作:) 很好的解决方案!你拯救了我的一天。谢谢【参考方案2】:

在斯威夫特中:

您需要创建一个作为UITableViewHeaderFooterView 子类的类并将其注册到表格视图。然后在viewForHeaderInSection 中,您执行let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderView") as! YourHeaderView,类似于您为 UITableViewCells 执行的操作。然后返回header

具有欺骗性的是,当它确实需要一个 dequeuedReusableHeaderFooterView 或 reloadData 时,函数调用返回 UIView? 会导致它消失

【讨论】:

你能提供一个sn-p的代码吗?我已经在这个问题上苦苦挣扎了好几天了,你是唯一一个建议这种方法的人(我认为这是正确的) 我忘了说拜托??【参考方案3】:

我找到了一种解决方法 - 不是很优雅,但它有效。 我没有提供一个包含多个部分的 NSIndexSet,而是在一个 for 循环中调用 reloadSections,每次调用中只有一个部分。

看起来像:

    for (Element *eleSection in self.gruppenKoepfe) 
        if ( eleSection.type.integerValue == qmObjectTypeFormularSpalte || eleSection.type.integerValue == qmObjectTypeFormularZeile ) 
            [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:nCount] withRowAnimation:UITableViewRowAnimationFade];
        
        nCount ++;
         

【讨论】:

***.com/questions/30149551/… 请检查这个。【参考方案4】:

我遇到了类似的问题,除了我试图删除/插入部分之外,我发现保持指向整个标题视图(即不仅仅是子视图)的强属性可以阻止它在部分更新期间消失。

例如属性和实例化

@property (nonatomic, strong) UIView *headerView;

-(UIView *)headerView 
  if ( !_headerView ) 
    _headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.view.bounds.size.width, 300)];
    // add additional view setup, including subviews
  
  return _headerView;

tableView:(UITableView *)viewForHeaderInSection:(NSInteger)section:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
    if ( section == theCorrectSection ) 
        return self.headerView;
    
    return nil;

【讨论】:

【参考方案5】:

我遇到了同样的问题,但以上都不是。我的问题是我隐藏了第一个标题,并且由于某种原因,在重新加载超过 10 次后,索引 2 处的标题被设置为隐藏。当我设置 headerView.hidden = false 时没问题。

【讨论】:

以上是关于UITableView reloadSections/reloadData:标题视图变为空白的主要内容,如果未能解决你的问题,请参考以下文章

UITableView reloadData、reloadSections:withRowAnimation: 和 reloadRowsAtIndexPaths:withRowAnimation: 的

UITableView reloadSections/reloadData:标题视图变为空白

tableView 使用 reloadSections:withRowAnimation: 时,会跳动的问题

reloadSections:withRowAnimation 动画出现问题

UITableView 重新加载部分时的内容插入更改

在 UITableView 中仅重新加载一个节标题