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

时间:2010-08-27 11:37:22

标签: uitableview core-data nsfetchedresultscontroller

我想知道是否有人知道为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 个答案:

答案 0 :(得分:1)

为您需要子类NSFetchedResultsController的部分提供自定义排序顺序。

来自NSFetchedResultsController班级文档:

  

如果要自定义节和索引标题的创建,则可以创建此类的子类。你覆盖   sectionIndexTitleForSectionName:if   你想要节索引标题   资本化以外的东西   部分名称的第一个字母。您   如果你,覆盖sectionIndexTitles   希望索引标题是什么   除了由...创建的数组   调用   sectionIndexTitleForSectionName:on   所有已知部分。

它有点隐藏所以你错过了前几次你读到的课程。

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

答案 1 :(得分:0)

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