我有一个视图控制器,它是UITableViewController的子类。这是我的viewWillAppear:动画方法:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (fetchedResultsController != nil) {
[fetchedResultsController release];
fetchedResultsController = nil;
}
[self.fetchedResultsController performFetch:nil];
[self.tableView reloadData];
}当调用super :animated时,看到fetchedResultsController被访问,这让我感到困惑。由于super是一个UITableViewController,并且该类本身没有viewWillAppear:animated方法,那么它的超类viewWillAppear:animated应该被调用,对吧?如果这是正确的,那么UIViewController类就不应该访问UITableViewController委托方法。但是我看到numberOfSectionsInTableView被调用了。我不确定为什么调用:animated会这样做。
因此,在我显式运行peformFetch和reloadData之前,表已经填充完毕。此时,它正在填充的数据已过期。
下面是fetchedResultsController代码
- (NSFetchedResultsController *) fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
NSFetchRequest *fetchRequest = ...
NSEntityDescription * entity = ...
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:10];
NSSortDescriptor *aSortDescriptor = ...
NSSortDescriptor *bSortDescriptor = ...
NSArray *sortDescriptors = ...
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = ...
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
...
[sortDescriptors release];
NSError *error = nil;
if (![fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved Error %@, %@", error, [error userInfo]);
abort();
}
return fetchedResultsController;
}发布于 2011-05-29 00:33:03
The documentation特别描述了这种行为:
当第一次加载表视图时,表视图控制器会重新加载表视图的数据。它还会在每次显示表视图时清除其选择(是否带动画,取决于请求)。
UITableViewController类在超类方法viewWillAppear:中实现了这一点。您可以通过更改clearsSelectionOnViewWillAppear属性中的值来禁用此行为。
https://stackoverflow.com/questions/6162889
复制相似问题