Gor*_*not 5 iphone objective-c uitableview nsfetchedresultscontroller nsfetchrequest
我有一个UITableView人口NSFetchedResultsController.初始提取工作正常.我可以添加,删除,修改等零问题.但我想在表中添加用户定义的排序.我这样做是通过改变NSFetchedResultsController使用不同的sortDescriptor设置和不同的设置sectionNameKeyPath.这是我更改提取的代码:
-(void)changeFetchData {
fetchedResultsController = nil;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSString *sortKey = @"sortKey";
NSString *cacheName = @"myNewCache";
BOOL ascending = YES;
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:ascending];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:sortKey cacheName:nil];
self.fetchedResultsController = aFetchedResultsController;
fetchedResultsController.delegate = self;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Fetch failed");
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
[self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
当我称这种方法时,效果很好.该表立即重新排序以使用新的部分信息和新的排序参数.但是,如果我向数据添加或删除项目,TableView不会更新其信息,从而导致崩溃.我可以NSLog记录fetchedResultsController中对象总数的计数,并看到它增加(和减少)但是如果我NSLog返回值numberOfRowsInSection以监视那里的变化,则调用该方法,但值不会改变.得到以下崩溃(添加,但删除一个是相似的)
无效更新:第2节中的行数无效.更新后的现有部分中包含的行数(3)必须等于更新前该部分中包含的行数(3),加上或减去数字从该部分插入或删除的行数(插入1个,删除0个).用户信息(null)
如果我重新启动应用程序,我会看到添加的项目,或者看不到已删除的项目,因此我正在修改数据源.
有任何想法吗?
旧控制器可能还活着。如果是这样,它可能仍然会调用表视图控制器作为其委托,并使用它自己的数据激活表更新。
我建议记录获取的结果控制器对象numberOfRowsInSection以确认它使用新的控制器。在分配新控制器之前,您应该将旧控制器的委托设置为 nil。
| 归档时间: |
|
| 查看次数: |
3680 次 |
| 最近记录: |