UiTableView标头不会消失

时间:2017-10-05 14:14:55

标签: ios objective-c uitableview

我将UITableView配置为普通样式,因此我可以将标题视图粘贴在表格的顶部,直到另一个标题将其拉出。

问题是:如果我的屏幕顶部有一个标题,并且我以编程方式滚动到表格的另一部分(该标题根本不应出现),那么UIView将不会被解雇。即如果我再次滚动到表格的那一部分,那个表格的部分就会显示该标题的幽灵。

See screenshot

我已经实施了方法- (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;,过滤掉可见屏幕之外的所有标题视图,并从superview中删除它们。我可以让它工作,但我想知道是否还有其他更好的解决方案。

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

3 个答案:

答案 0 :(得分:1)

我不完全确定我完全理解您的问题,但是一旦您以编程方式滚动离开此区域/部分并且那么您的标题视图(某些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;

}

这样,无论您手指滚动还是以编程方式设置您喜欢的内容偏移,您的表视图都将知道要绘制什么,何时绘制以及放置它。

使用他们的代表有点拖累,因为它在开始时有点单调乏味,但使用viewForHeaderInSection证明了我获得我想要的结果的唯一方法。

希望这会有所帮助 - 快乐的编码!

答案 1 :(得分:1)

<强> TL; DR

请勿在{{1​​}}和beginUpdates之间明确滚动表格视图。

<强>解释

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

endUpdates

问题是endUpdates正在进行一系列调用,结束调用我的方法- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { [_conversationTableView beginUpdates]; } - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { [_conversationTableView endUpdates]; } (实际上这是一个非常难看的代码)。顾名思义,此方法调用[self scrollToBottom]将表格视图滚动到表格的底部。

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated; - beginUpdates期间显式滚动表格是我整个问题的罪魁祸首。

<强>解决方案

仅在完成endUpdates后滚动表视图。

endUpdates

旁注

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

答案 2 :(得分:0)

在不应该显示的情况下,将sectionHeader高度手动设置为0

tableView.sectionHeaderHeight = 0;