Ios UiTableView标题未消失

Ios UiTableView标题未消失,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有一个配置为普通样式的UITableView,因此我可以将标题视图粘贴在表的顶部,直到另一个标题将其拉开 问题是:如果我在屏幕顶部粘贴了一个标题,并且通过编程方式滚动到表的另一部分(该标题根本不应该出现在该部分),那么UIView将不会被取消。也就是说,如果我再次滚动到表格的该部分,则该标题的重影将在表格的该部分可见 我已经实现了方法-(void)tableView:(UITableView*)tableView didendisplayingheaderview:(nonnull UIVi

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

问题是:如果我在屏幕顶部粘贴了一个标题,并且通过编程方式滚动到表的另一部分(该标题根本不应该出现在该部分),那么UIView将不会被取消。也就是说,如果我再次滚动到表格的该部分,则该标题的重影将在表格的该部分可见

我已经实现了方法
-(void)tableView:(UITableView*)tableView didendisplayingheaderview:(nonnull UIView*)view for section:(NSInteger)section
,以了解发生了什么。我发现,如果我手动滚动直到标题从屏幕上移开,则调用此委托。但是如果以编程方式滚动,则不会调用委托

顺便说一下,我尝试使用两种不同的方法以编程方式滚动,问题是相同的

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
我可以想象的一个解决方法是实现
-(void)scrollViewDidScroll:(UIScrollView*)scrollView,筛选可见屏幕之外的所有标题视图,并将其从superview中删除。我可能可以让它工作,但我想知道是否有其他更好的解决方案


[编辑]如果我调用
-(void)setContentOffset:(CGPoint)contentOffset动画:(BOOL)动画设置动画=是时,错误不会发生。我可以使用此解决方案,但在某些情况下,我确实希望在不使用动画的情况下进行滚动。

我不完全确定我是否完全理解您的问题,但在以编程方式从该区域/部分滚动并然后返回后,您的标题视图(某些
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;

}
-(UIView*)表格视图:(UITableView*)表格视图标题部分:(NSInteger)部分{
//对于每个部分,只需返回相应的标题视图
...
NSString*someIdentifier=[NSString stringWithFormat:@“sectionHeaderView:”,];
UITableViewHeaderFooterView*myHeaderView=[self.tableView出列重用HeaderFooterViewWithIdentifier:someIdentifier];
如果(!myHeaderView){
//找不到具有该ID的标题视图。请创建一个新的标题视图
}
... 
返回MyHeadServiceForSection;
}
通过这种方式,无论您是用手指滚动还是以编程方式设置内容偏移量,您的表视图都将知道绘制什么、何时绘制以及放置在何处

使用他们的代理有点拖拉,因为一开始有点乏味,但使用
viewForHeaderInSection
证明了我获得我(您)想要的结果的唯一方法

希望这有帮助-快乐编码

TL;DR

不要在
beginUpdates
endUpdates
之间显式滚动表格视图

解释

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

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

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [_conversationTableView endUpdates];
}
问题是endUpdates进行了一系列调用,最终调用了我的方法
[self-scrolltobttom]
(实际上这是一个非常难看的代码)。这个方法,顾名思义,调用
-(void)setContentOffset:(CGPoint)contentOffset-animated:(BOOL)animated
将表格视图滚动至表格底部

beginUpdates
-
endUpdates
期间,表的显式滚动是我整个问题的罪魁祸首

解决方案

仅在完成endUpdates后滚动表视图

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

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

    [self scrollToBottom];
}
旁注


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

在不应显示时手动将sectionHeader高度设置为0

tableView.sectionHeaderHeight = 0;

我在用这个方法。然而,也许我正在做一些我不应该做的事情。我正在这个方法中设置单元格的框架<代码>-(UIView*)tableView:(UITableView*)tableView视图ForHeaderInSection:(NSInteger)section{…view.frame=CGRectMake(0,0,tableView.frame.size.width,view.frame.size.height);…return view;}
设置框架不应该是问题,只要它对所有单元格/部分保持不变。我会为每个
UITableViewHeaderFooterView
使用“唯一”标识符,这样表才能真正知道每个UITableViewHeaderFooterView的唯一标识符是什么意思?你能给我一个文档来读一下吗?当然-这是苹果的文档:我注意到,如果你给每个标题视图提供相同的ID,我们可以说“sectionHeaderView”,表可能会使用相同的reuseID处理它所看到的许多视图,并且不确定在哪里绘制什么。我更新了我的答案,增加了一些上下文,以了解我在这里提到的内容-应该让事情更清楚:)如果将表视图设置为“分组”而不是“普通”,是否会出现问题?不,我刚刚测试了它。当标题超出其“自然”位置(卡在表格顶部)时会出现问题,这在分组样式中不会发生。这可能会给你指明正确的方向我不这么认为。我的实现中没有使用contentInset。天哪,正如我所说,我使用的是
[\u conversationTableView setContentOffset:newOffset动画:mustAnimate]
自动滚动表格。我刚刚意识到,如果动画是肯定的,错误不会发生!我将对问题进行编辑以提及这一点。但在这一点上,我只能认为这是一个iOS错误。