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

时间:2011-12-28 15:56:12

标签: ios uitableview

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

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

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

所以我觉得桌子的绘图存在一些问题。

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

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

如果我使用

[self.tableView reloadData]

相反,一切正常。

我使用的原因

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

是因为我想要动画。

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

5 个答案:

答案 0 :(得分:44)

我意识到自提出这个问题以来已经很长时间了,但我认为下面给出的所有答案都是错误的。

我遇到了同样的问题(和其他人的代码一样),并且当我意识到代码没有正确地重用表头时,这篇文章即将被这个帖子所迷惑。标题消失是因为代码只提供了UIView,而不是UITableViewHeaderFooterView,正确注册并设置为可重用。

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

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

答案 1 :(得分:1)

我找到了一种解决方法 - 不是很优雅,但它有效。 我没有提供带有多个节的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 ++;
    }     

答案 2 :(得分:1)

在斯威夫特:

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

欺骗性的事情是当函数真正需要dequeuedReusableHeaderFooterView或UIView?将导致它消失时,函数调用reloadData的返回

答案 3 :(得分:0)

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

e.g。属性和实例化

@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;
}

答案 4 :(得分:0)

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