我有一个视图控制器,它是UITableViewController的子类。这是我的viewWillAppear:动画方法:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (fetchedResultsController != nil) {
[fetchedResultsController release];
fetchedResultsController = nil;
}
[self.fetchedResultsController performFetch:nil];
[self.tableView reloadData];
}
通过在调用[super viewWillAppear:animated]时看到访问的fetchedResultsController,我感到很困惑。由于super是一个UITableViewController,并且没有viewWillAppear:该类的动画方法本身,那么它的超类viewWillAppear:animated应该被调用,对吧?如果这是正确的,那么UIViewController类不应该访问UITableViewController委托方法。但是我看到numberOfSectionsInTableView被调用了。我不确定为什么调用super viewWillAppear: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;
}
答案 0 :(得分:1)
The documentation具体描述了这种行为:
当表视图即将在第一次加载时出现时,表视图控制器会重新加载表视图的数据。每次显示表格视图时,它还会清除其选择(有或没有动画,具体取决于请求)。
UITableViewController
类在超类方法viewWillAppear:
中实现了这一点。您可以通过更改clearsSelectionOnViewWillAppear
属性中的值来禁用此行为。