NSFetchedResultsController 部分索引将转到错误的行

Posted

技术标签:

【中文标题】NSFetchedResultsController 部分索引将转到错误的行【英文标题】:NSFetchedResultsController Section Index is going to the wrong row 【发布时间】:2011-07-11 03:36:09 【问题描述】:

我有一个带有部分的 FRC。我已经实现了部分索引(就像在它工作的其他 6 个视图中一样),它显示了;但是,当我点击其中一个索引时,它会转到中间并停止。我的 FRC 和 sectionIndex 方法如下。

我在调试器中单步执行了代码,sectionForSectionIndexTitle 返回正确的索引(如果重要,则为 15),但它只是停在“I”处。

有什么想法吗?

- (NSFetchedResultsController *)fetchedResultsControllerWithPredicate:(NSPredicate *)aPredicate 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Categories" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
//[fetchRequest setFetchBatchSize:20];

NSSortDescriptor *sortByName  = [[NSSortDescriptor alloc] initWithKey:@"Category" ascending:YES];
NSSortDescriptor *sortByPG = [[NSSortDescriptor alloc]initWithKey:@"ProductGroup" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortByName, sortByPG, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortByName release];
[sortByPG release];
[sortDescriptors release];
NSString *cacheName = nil; // @"Root";
if(!aPredicate)
    //aPredicate = [NSPredicate predicateWithFormat:@"Category <> %@", @"EQUIPMENT"];

[fetchRequest setPredicate:aPredicate];  
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"Category" cacheName:cacheName];


aFetchedResultsController.delegate = self;

[fetchRequest release];

NSError *anyError = nil;


if(![aFetchedResultsController performFetch:&anyError])
    NSLog(@"Error fetching: %@", anyError);

return [aFetchedResultsController autorelease];  



    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
 
NSMutableArray *sectionTitles = [[[NSMutableArray alloc] init] autorelease];
[sectionTitles addObject:UITableViewIndexSearch];
[sectionTitles addObjectsFromArray:[self.fetchedResultsController sectionIndexTitles]];
return sectionTitles;
//return [self.fetchedResultsController sectionIndexTitles];


-(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index


if (index == 0) 
    [tableView setContentOffset:CGPointZero animated:NO];
    return NSNotFound;

//NSInteger indexToGoTo =  [self.fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];

编辑:

return index - 1; <-- This is wrong

//This is right!
return [self.fetchedResultsController sectionForSectionIndexTitle:title atIndex:index - 1]; 


【问题讨论】:

【参考方案1】:

天啊!好吧,我希望这可以节省其他人几个小时。 . .

sectionForSectionIndexTitle

而不是

return index - 1;

应该是的

return [self.fetchedResultsController sectionForSectionIndexTitle:title atIndex:index - 1];

我不知道为什么它在其他地方有效,但我也在改变它。

【讨论】:

对于遇到此线程的任何人来说,仅供参考,看来index-1 不适合我的情况,因为它引发了异常。在我的情况下,简单地使用 index 可以正常工作。 OP 一定发生了一些奇怪的事情。 简单地尝试了[self.fetchedResultsController sectionForSectionIndexTitle:title atIndex:index]; 失败后,我尝试了...atIndex:(index - 1) 成功了。我很紧张,这可能取决于数据。索引中的第一项是“1”(公司喜欢称自己为“1st What”

以上是关于NSFetchedResultsController 部分索引将转到错误的行的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?