重新加载 UITableView 数据而不重新加载视图?
Posted
技术标签:
【中文标题】重新加载 UITableView 数据而不重新加载视图?【英文标题】:Reload UITableView Data without reloading the view? 【发布时间】:2011-10-11 07:31:12 【问题描述】:我有一个UITableView
,其中包含一堆项目,每次通过refreshRows
方法加载表格时,我都会从Web 应用程序获取这些项目的状态。完成此操作后,我重新加载表。
当我向表中添加项目时,我发现自己收到一条消息“无效更新:部分中的行数无效”。事实证明重新加载表中的数据是必要的,因此我将旧的viewDidAppear
方法更改为新的viewDidAppear
方法(如下所示)。我现在有两个reloadData
调用,它们都刷新了我的视图。
问题:有没有更清洁的方法来做到这一点?添加后我需要重新加载我的数据,但我不希望在获取来自网络的所有状态之前重新加载视图。
- (void)viewDidAppear:(BOOL)animated // new
NSLog(@"viewDidAppear");
[super viewDidAppear:animated];
[self.tableView reloadData]; // <------------- Prettier way to do this?
[self refreshRows];
[self.tableView reloadData];
- (void)viewDidAppear:(BOOL)animated // old
NSLog(@"viewDidAppear");
[super viewDidAppear:animated];
[self refreshRows];
[self.tableView reloadData];
- (void)refreshRows
// foreach row get status from webapp
编辑:
这是请求的代码:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
id <NSFetchedResultsSectionInfo> sectionInfo =
[[self.fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
【问题讨论】:
你能发布你的 numberOfRowsInSection 方法吗?您是否使用 insertRowsAtIndexPaths 将项目添加到表中?您提到的错误通常是在您调用 tableView 插入方法而不更新模型时引起的。 这就是正在发生的事情......但是有一种方法可以在不重新加载视图的情况下重新加载模型? 【参考方案1】:如果只有您的数据源知道更改(并且应该注意这一点),您可以尝试这样做:
-
注册您的 TableView 以观察通知中心的数据源更新。
从数据源向 NSNotificationCenter 发布更新已经到来的通知。
使用 [self.tableView reloadData] 响应 TableView 中的更新;
在数据源中:
- (void) dataSourceChanged
// All instances of TestClass will be notified
[[NSNotificationCenter defaultCenter]
postNotificationName:@"myUniqueDataSourceChanged"
object:self];
在表视图控制器中:
- (void)viewDidAppear:(BOOL)animated // new
NSLog(@"viewDidAppear");
[super viewDidAppear:animated];
[self.tableView reloadData]; // <------------- Prettier way to do this?
[self refreshRows];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveNotification:)
name:@"myUniqueDataSourceChanged"
object:self.dataSource];
- (void) receiveNotification:(NSNotification *) notification
if ([[notification name] isEqualToString:@"myUniqueDataSourceChanged"])
[self dataSourceHasBeenChanged];
- (void) dataSourceHasBeenChanged
[self.tableView reloadData];
[self refreshRows];
这将在每次更新数据源时自动更新您的表格视图
【讨论】:
以上是关于重新加载 UITableView 数据而不重新加载视图?的主要内容,如果未能解决你的问题,请参考以下文章
重新加载 UITableView 而不重新加载 Section Header
重新加载 UIViewController 而不返回 UITableView