【问题标题】:UITableView reloadSections/reloadData: header view becomes blankUITableView reloadSections/reloadData:标题视图变为空白
【发布时间】: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 包装不起作用。

【问题讨论】:

    标签: ios uitableview


    【解决方案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 ++;
        }     
    

    【讨论】:

    【解决方案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 时没问题。

      【讨论】:

        猜你喜欢
        • 2016-03-21
        • 2011-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-02
        • 1970-01-01
        • 1970-01-01
        • 2013-01-28
        相关资源
        最近更新 更多