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: 时,会跳动的问题