Ios UITableView重新加载节/重新加载数据:标题视图变为空白

Ios UITableView重新加载节/重新加载数据:标题视图变为空白,ios,uitableview,Ios,Uitableview,我有一个UITableView和一些部分,每个部分都有自己的标题视图。 当用户点击节的标题视图时,该节的所有行都将折叠。我要做的是,将该节的行数设置为0,然后调用: [self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationBottom]; 除一件事外,所有工作都按预期进行:节的标题视图变为白色空白。当我滚动表格时,标题再次变为正常 所以我猜这张桌子的画有点问题 有趣的是,如果我使用UITab

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

[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationBottom];
除一件事外,所有工作都按预期进行:节的标题视图变为白色空白。当我滚动表格时,标题再次变为正常

所以我猜这张桌子的画有点问题

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

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

如果我使用

[self.tableView reloadData]
相反,一切都很好

我使用

[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationBottom];
是因为我想要动画


用beginUpdates/endupdates包装不起作用。

我找到了一个解决方案-不是很优雅,但很有效。 我没有提供包含多个节的NSIndexSet,而是在for循环中调用重载节,每次调用中只有一个节

看起来像:

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

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

e、 g.属性和实例化

@property(非原子,强)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*)视图的headerinsection:(NSInteger)部分

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

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

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

请看下面的答案:


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

我也有同样的问题,但不是上述问题。我的问题是,我隐藏了第一个标题,由于某种原因,在超过10次重新加载后,索引2处的标题被设置为隐藏。当我设置headerView.hidden=false时,一切正常。

在Swift中:

您需要创建一个属于
UITableViewHeaderFooterView
子类的类,并将其注册到表视图中。然后在
viewForHeaderInSection
中,将
let header=tableView.dequeueReusableHeaderFooterView(带有标识符:“HeaderView”)作为!YourHeaderView
,类似于对UITableViewCells所做的操作。然后返回
标题


欺骗性的事情是函数调用返回
UIView?
当它真的需要一个出列的可重用HeaderFooterView或
重新加载数据时
会导致它消失

很好的捕获-现在看起来很明显…:)@GeneCode Raz的答案很好地解释了重用过程。@Darren感谢您的回答。在iOS 12中,我在下面添加了一些快捷的注释!我有一个自定义的
UITableViewCell
,以Xib文件为头。有趣的是,我保持了Xib的原样,只是创建了
UITableViewHeaderFooterView
的自定义类子类,并更改了表视图的寄存器和出列函数,它开始工作:)很好的解决方案!你救了我一天。谢谢你能提供一段代码吗?我已经为这个问题挣扎了好几天了,你是唯一一个建议这个方法的人(我认为这是正确的方法),我忘了说请检查这个。