2011-05-28 92 views
1

我有一个视图控制器是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; 

} 

回答

1

The documentation具体地描述这种行为:

当表视图即将出现它的加载在第一时间,表视图控制器重新加载该表查看数据。每次显示表格视图时,它也会清除其选择(带或不带动画,具体取决于请求)。 UITableViewController类在超类方法viewWillAppear:中执行此操作。您可以通过更改clearsSelectionOnViewWillAppear属性中的值来禁用此行为。

+1

感谢您的帮助。我通常在下拉框中滚动浏览方法,并且没有提到UITableViewController的viewWillAppear方法。我仍然没有看到超类viewWillAppear如何应用,所以我猜他们无意中将它从文档中删除。 – Jim 2011-05-29 00:50:23