我有一个视图控制器是UITableViewController的子类。这里是我的viewWillAppear中:动画方法:UITableViewController viewWillAppear
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (fetchedResultsController != nil) {
[fetchedResultsController release];
fetchedResultsController = nil;
}
[self.fetchedResultsController performFetch:nil];
[self.tableView reloadData];
}
我收到通过观察fetchedResultsController被访问时混淆[超级viewWillAppear中:动画]被调用。由于super是一个UITableViewController,并且没有viewWillAppear:该类的动画方法本身,那么它的超类viewWillAppear:animated应该被调用,对吧?如果这是正确的,那么UIViewController类不应该访问UITableViewController委托方法。但是我看到numberOfSectionsInTableView正在被调用。我不知道为什么超级viewWillAppear:动画会这样做。
因此,在我明确运行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;
}
感谢您的帮助。我通常在下拉框中滚动浏览方法,并且没有提到UITableViewController的viewWillAppear方法。我仍然没有看到超类viewWillAppear如何应用,所以我猜他们无意中将它从文档中删除。 – Jim 2011-05-29 00:50:23