iOS UITableView reloadData 仅在我第二次调用我的 reload 函数时刷新表

Posted

技术标签:

【中文标题】iOS UITableView reloadData 仅在我第二次调用我的 reload 函数时刷新表【英文标题】:iOS UITableView reloadData only refreshes table the second time I call my reload function 【发布时间】:2012-03-22 22:24:33 【问题描述】:

这是我的重载功能

- (void) reloadTable:(id)sender
   
    NSLog(@"Reload Table");
    NSLog(@"%@",[appDelegate queryList]);
    [self.driverTable reloadData];
    [self.driverTable setNeedsLayout];
    [self.driverTable setNeedsDisplay];

这是我从 web 服务接收数据后调用它的地方

if( [elementName isEqualToString:@"Response"]) 
    Response = NO;
    LookupView *lookupView = [[LookupView alloc] initWithNibName:@"LookupView" bundle:nil];
    [lookupView reloadTable:self];

我现在遇到的问题是通过按查找按钮进行搜索并接收数据之后。该表不会用新数据刷新。如果我通过再次按下查找按钮再次调用相同的函数,表格会重新加载。现在我知道数据在那里,因为我在调用表重新加载之前打印了数组。

有什么想法吗?

【问题讨论】:

为什么需要 setNeedsLayout 和 setNeedsDisplay? UITableView 不需要重绘,它们会在重新加载时自行处理。 哦,我只是在这里研究解决方案,一些有类似问题的人提到了这个,所以我只是尝试 删除@CodaFi提到的那些东西方法。它不属于那里。 @DanielChen 您说您的数据正在第二次重新加载,当您按下查找按钮时。那么 reloadTable: 方法是否在第一次被调用?如果它被调用,那么你打印数组时得到的控制台输出是什么?? 我相信它被调用了,因为当该方法被调用时我正在打印列表。甚至在我第一次单击该按钮时,列表也会打印出预期的数据列表。我删除了@CodaFi 提到的行 【参考方案1】:

我遇到了同样的问题。根据 Apple 的文档,“不应在插入或删除行的方法中调用 reloadData”。我使用的一种解决方法是延迟对 reloadData 的调用,以便它不会在更新表后立即调用。试试这个:

[self performSelector:@selector(delayedReloadData) withObject:nil afterDelay:0.5];

在适当的地方使用以下 delayReloadData 实现

 -(void)delayedReloadData
    [self.tableView reloadData];

我从这种方法中看到的负面影响是,如果表格行可见,则在显示其内容之前会有短暂的延迟。

【讨论】:

this 问题可以算作@bobnoble 回答的跟进【参考方案2】:

通过在您的 if loop 中看到 elementName,我发现您正在执行 XML 解析。为什么您需要在解析代码中使用load a NIB file。它有什么用?你可以像这样调用你的 reloadTable: 方法。

[self reloadTable:self];

您正在使用 app delegate 文件中的某个数组填充您的 tableView。那么您是否在 ViewController 中初始化了您的委托?

【讨论】:

是的,你是对的,我正在使用应用程序委托填充包含表数据的数组。一旦我知道所有信息都加载到数组中,我使用应用程序委托在表的视图控制器中调用刷新表函数。

以上是关于iOS UITableView reloadData 仅在我第二次调用我的 reload 函数时刷新表的主要内容,如果未能解决你的问题,请参考以下文章

iOS小技能:1. 什么是UITableView? 2. UITableView如何展示数据

iOS开发之UITableView的使用

iOS开发UI篇—UITableview控件简单介绍

iOS横竖滚动UITableView

iOS-UITableView重用机制

iOS基础——通过案例学知识之UITableView(上)