如何更改从NSFetchedResultsControler填充的UITableview中节的显示顺序?

我想知道是否有人知道为UITableView中的部分定义自定义显示顺序的最佳解决方案 - 我使用Core Data和NSFetchedResultsControler加载数据,我成功使用NSSortDescriptors并成功地将返回的项目分组到sectionNameKeyPath:

到目前为止这么好但是 - 这些部分按字母顺序列出,我想覆盖它并按特定的自定义排序顺序排列这些部分 .

例如,如果我有一个名为Item的实体,其属性名为color,我使用此颜色属性作为sectionNameKeyPath:我将如何以特定方式对这些部分进行排序 - 目前这些部分显示为

蓝色,绿色,靛蓝,橙色,红色,紫色,黄色 .

  • 因为他们有一个NSortDescriptor应用于NSFetchedResultsController(我已经定义) . 但是我怎么能以特定的方式重新排序这些部分来显示这样的部分 -

红色,橙色,黄色,绿色,蓝色,靛蓝,紫罗兰色 .

我的NSFetchedResultsController代码如下 -

- (NSFetchedResultsController *)fetchedResultsController {

    if (fetchedResultsController_ != nil) {
        return fetchedResultsController_;
    }

    /*
     Set up the fetched results controller.
    */
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];

    // Edit the sort key as appropriate.

    NSSortDescriptor *colourDescriptor = [[NSSortDescriptor alloc] initWithKey:@"colour" ascending:YES];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:colourDescriptor, sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"colour" cacheName:@"Root"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [colourDescriptor release];
    [sortDescriptors release];

    NSError *error = nil;
    if (![fetchedResultsController_ performFetch:&error]) {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return fetchedResultsController_;
}

我理解发布的有关使用NSManagedObject的自定义子类和getter方法的示例,以动态分配要用作sectionNameKeyPath的属性:但这些示例仍然倾向于提供按字母顺序列出的节名称 .

显然我对此不熟悉,但任何建议/方向都将不胜感激 .

回答(2)

2 years ago

要为您需要子类 NSFetchedResultsController 的节提供自定义排序顺序 .

来自 NSFetchedResultsController 类文档:

如果要自定义节和索引 Headers 的创建,则可以创建此类的子类 . 您重写sectionIndexTitleForSectionName:如果您希望节索引 Headers 不是节名称的大写首字母 . 如果希望索引 Headers 不是通过在所有已知部分上调用sectionIndexTitleForSectionName:创建的数组,则覆盖sectionIndexTitles .

它有点隐藏,所以你错过了你读过这堂课的前几次 .

要实现,获取获取结果控制器的 section 属性,该属性是按字母顺序排序的节名称数组,然后返回tableview部分索引的右元素 .

2 years ago

不存储字符串“Red”,“Orange”,“Yellow”等,而是存储表示颜色的枚举值 . 因此将0存储为红色,将1存储为橙色等 . 然后将正确排序 . 当您想要显示该部分的 Headers 时,请使用枚举来确定它是哪种颜色并找到正确的字符串 .