问题

如何索引一个 NSFetchedResultsController ,以便我可以在表视图上实现一个A-Z索引.

我在初始化程序中看到我可以执行 sectionNameKeyPath ,但这只会在其自己的部分放置唯一的对象.

这是我的 NSFetchedResultsController

    - (NSFetchedResultsController *)fetchedResultsController
{
    if (__fetchedResultsController != nil) {
        return __fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Customer" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    [fetchRequest setFetchBatchSize:20];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"name" cacheName:@"Customer"];
    aFetchedResultsController.delegate = self;

    self.fetchedResultsController = aFetchedResultsController;

    return __fetchedResultsController;
}  


解决方法

实现 sectionIndexTitlesForTableView: 这样:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [self.fetchedResultsController sectionIndexTitles];
}

这将为您提供tableView右侧的索引.

如果您希望您的版块拥有A,B,C,D等名称,则必须执行一个返回对象的第一个字母的方法.

如下所示:

- (NSString *)firstLetter {
    [self willAccessValueForKey:@"firstLetter"];
    NSString *firstLetter = [[[self name] substringToIndex:1] uppercaseString];
    [self didAccessValueForKey:@"firstLetter"];
    return firstLetter;
}

这进入你的coredata实体的自定义子类.

然后将一个名为 firstLetter 的transient属性添加到您的核心数据实体,并使用 firstLetter 替换NSFetchedResultsController init中的sectionNameKeyPath




相关问题推荐