UiTableView标题不会消失

我有一个UITableViewconfiguration为普通样式,所以我可以将表头视图停留在表的顶部,直到另一个标题将其拉下。

问题是:如果我有一个标题卡在屏幕的顶部,并以编程方式滚动到表的另一部分(该标题不应该出现在那里),该UIView将不会被解雇。 也就是说,如果我再次滚动到表格的那一部分,那么这个表头的一个鬼影将在表格的那个部分上可见。

看截图

我已经实现了方法- (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(nonnull UIView *)view forSection:(NSInteger)section来理解发生了什么。 我发现,如果我手动滚动,直到一个标题拉离屏幕,这个委托被调用。 但是,如果我以编程方式滚动,代理不会被调用。

顺便说一句,我试着用两种不同的方法编程滚动,问题是一样的。

 - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated; - (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated; 

我可以想象的一个解决方法是实现- (void)scrollViewDidScroll:(UIScrollView *)scrollView; ,筛选可见屏幕之外的所有标题视图,并从超级视图中删除它们。 我可以让它工作,但我想知道是否还有其他更好的解决scheme。

[编辑]如果我调用- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated; 与animation= YES,错误不会发生。 我可以去这个解决scheme,但我真的希望在一些情况下滚动没有animation。

不完全确定,我完全理解你的问题,但似乎一旦你编程滚动离开这个区域/部分, 然后返回,你的标题视图(一些UIView )不能正确呈现。

我不知道你是如何填充你的标题视图的内容,但我有几个应用程序运行UITableView的多节标题,需要更新的滚动/内容偏移没有问题, 只要你“画”你的头与这个委托:

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { // Per section, simply return the appropriate header view ... NSString *someIdentifier = [NSString stringWithFormat:@"sectionHeaderView:<some #, letter, or tag>", <SOMETHING UNIQUE ADD HERE>]; UITableViewHeaderFooterView *myHeaderView = [self.tableView dequeueReusableHeaderFooterViewWithIdentifier:someIdentifier]; if (!myHeaderView) { // No header view found with that ID. Make a new one } ... return myHeaderViewForSection; } 

通过这种方式,无论您是手动滚动还是以编程方式设置内容偏移量,您的表格视图都会知道要绘制什么内容,何时绘制内容以及将其放置在何处。

使用他们的委托是有点拖累,因为它在开始时是有点乏味的,但是使用viewForHeaderInSectioncertificate了我得到我想要的结果的唯一方法。

希望这有助于 – 快乐的编码!

TL; DR

不要在beginUpdatesendUpdates之间显式地滚动表视图。

说明

我正在使用NSFetchedResultsController填充表。 这些是我NSFetchedResultsControllerDelegate的一些方法的实现。

 - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { [_conversationTableView beginUpdates]; } - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { [_conversationTableView endUpdates]; } 

问题是,endUpdates正在调用一连串的调用,结束调用我的方法[self scrollToBottom] (这实际上是一个非常丑陋的代码)。 这个方法,如名字所示,调用- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated; 将表格视图滚动到表格的底部。

beginUpdatesendUpdates期间显式滚动表是我整个问题的罪魁祸首。

只有在完成endUpdates后才能滚动表格视图。

 - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { [_conversationTableView beginUpdates]; } - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { [_conversationTableView endUpdates]; [self scrollToBottom]; } 

边注

这也解决了滚动时表格视图有时会闪烁的问题。