嘿伙计们,所以我的NSFetchedResultsController在3.1 SDK下运行正常,但是我开始得到一些奇怪的错误,特别是在我在3.0下尝试时的委托方法。我已经确定这与NSFetchedResultsControllerDelegate方法有关。这就是我设置的。
inEditingMode的内容与我实现向表中添加另一个静态部分的方式有关。
- (void)controllerWillChangeContent:(NSFetchedResultsController*)controller {
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type{
NSIndexSet *sectionSet = [NSIndexSet indexSetWithIndex:sectionIndex];
if(self.inEditingMode){
sectionSet = [NSIndexSet indexSetWithIndex:sectionIndex + 1];
}
switch (type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:sectionSet withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:sectionSet withRowAnimation:UITableViewRowAnimationFade];
break;
default:
[self.tableView reloadData];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath{
NSIndexPath *relativeIndexPath = indexPath;
NSIndexPath *relativeNewIndexPath = newIndexPath;
if(self.inEditingMode){
relativeIndexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section + 1];
relativeNewIndexPath = [NSIndexPath indexPathForRow:newIndexPath.row inSection:newIndexPath.section + 1];
}
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:relativeNewIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:relativeIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
default:
[self.tableView reloadData];
break;
}
}
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller{
[self.tableView endUpdates];
}
当我向托管对象上下文添加实体时,我收到以下错误:
Serious application error. Exception was caught during Core Data change processing: *** -[NSCFArray objectAtIndex:]: index (1) beyond bounds (1) with userInfo (null)
我在objc_exception_throw上设置了一个断点,并且似乎在controllerDidChangeContent内部发生了崩溃。
如果我注释掉所有的self.tableView方法,并在controllerDidChangeContent中放置一个[self.tableView reloadData],那么一切都按预期工作。
任何人都知道为什么会这样?
答案 0 :(得分:2)
在NSFetchedResultsController的文档中,特别提到了3.0实现中的一个错误,该错误导致控制器报告的部分数量与UITableView预期的部分数量之间存在差异。这是他们提供的解决方法:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
NSUInteger count = [[<#Fetched results controller#> sections] count];
if (count == 0) {
count = 1;
}
return count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSArray *sections = [<#Fetched results controller#> sections];
NSUInteger count = 0;
if ([sections count]) {
id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:section];
count = [sectionInfo numberOfObjects];
}
return count;
}
请注意,OS 3.1不需要此解决方法,因此这可以解释您没有看到错误的原因。当sectionNameKeyPath设置为nil时,仅在3.0中需要解决方法。如果要为sectionNameKeyPath设置值,则可能不是问题。