我有一个UITableView
,其中包含一系列项目,每次通过方法refreshRows
加载表格时,我都会从网络应用中获取这些项目。在我这样做后,我重新加载表。
当我将一个项目添加到我的表中时,我发现自己收到一条消息“无效更新:部分中的行数无效”。重新加载表中的数据是必要的,因此我从旧的viewDidAppear
方法进行了更改(如下所示)。我现在有两个reloadData
次调用,这些调用都刷新了我的观点。
问题:有更清洁的方法吗?添加后我需要重新加载我的数据,但我不想重新加载视图,直到获取Web上的所有状态。
- (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];
}
答案 0 :(得分:4)
如果只有您的数据源知道更改(并且应该观察到这一点),您可能会尝试这样做:
在数据源中:
- (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];
}
这将自动更新每次数据源更新时的表视图