11

我有一个NSFetchedResultsController从核心数据结构中获取数据的专辑列表。它目前是由艺术家排序的,所以所有的 A、B 等。我想添加一个索引,以便用户可以快速跳转到每个字母,我正在使用下面的代码来做这件事。问题是部分标题现在也是“A”、“B”、“C”等,这意味着我已经按照字母顺序丢失了部分标题,每个艺术家都在上面(“Adele”、“America” ”、“披头士乐队”等)

我希望索引使用字母 A 到 Z,但部分标题按字母顺序显示艺术家姓名。按下索引中的一个字母会跳转到第一个带有该字母的艺术家。我怎样才能做到这一点(索引中的字母字符,但部分标题的属性不同)?

编辑:如果我将 my 设置sectionNameKeyPath为我的author字段,则 AZ 索引可见,但字母不会与名称同步,例如,如果我点击 S,它会将我带到以 AL 开头的艺术家,或者点击 G 将我带到AB。我不太清楚为什么会这样,也许部分索引搞砸了?

这是我正在使用的代码:

在我的NSManagedObject子类中:

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

在我的视图控制器中,创建 FRC:

NSFetchedResultsController *byAuthorFRC = [[NSFetchedResultsController alloc] initWithFetchRequest: _fetchRequest
                                                                              managedObjectContext: [[CDManager sharedManager] managedObjectContext]
                                                                                sectionNameKeyPath: @"firstLetter"
                                                                                         cacheName: nil];

这是我的sectionIndexTitlesForTableView:方法:

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

2 回答 2

20

sectionNameKeyPath:@"author" 正确的参数,因为这就是您希望将表分组为部分的方式。标准实施

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

返回每个节标题的第一个字母,因此不需要单独的 firstLetter方法。

为了从节索引到节的正确同步,您必须实现表视图数据源方法tableView:sectionForSectionIndexTitle:atIndex:。与获取的结果控制器相关的标准实现是:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    return [self.fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];
}

编辑

迅速:

func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
    return fetchedResultsController.sectionIndexTitles
}

func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int {
    return fetchedResultsController.sectionForSectionIndexTitle(title, atIndex: index)
} 
于 2013-04-11T21:47:36.490 回答
6

斯威夫特 2

将此添加var到您的NSManagedObject

class Adherent: NSManagedObject {

    var initialNom: String {
        self.willAccessValueForKey("initialNom")
        let initial = (self.nom as NSString).substringToIndex(1)
        self.didAccessValueForKey("initialNom")
        return initial
    }

}

然后在您的NSFetchedResultsController构造函数中使用它(不要忘记使用“真实”属性进行排序)

let nomSort = NSSortDescriptor(key: "nom", ascending: true)
request.sortDescriptors = [nomSort]

self.fetchedResultController = NSFetchedResultsController(
    fetchRequest: request, 
    managedObjectContext: managedObjectContext, 
    sectionNameKeyPath: "initialNom", 
    cacheName: nil)

在您的表格视图中,实现(至少)这些:

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return self.fetchedResultController.sections!.count
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let sections = self.fetchedResultController.sections!
    let sectionInfo = sections[section]
    return sectionInfo.numberOfObjects
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    [...]
}

func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
    return self.fetchedResultController.sectionIndexTitles
}

func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int {
    return self.fetchedResultController.sectionForSectionIndexTitle(title, atIndex: index)
}

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return self.fetchedResultController.sectionIndexTitles[section]
}
于 2016-05-11T10:23:38.980 回答