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

Posted

技术标签:

【中文标题】如何更改从 NSFetchedResultsControler 填充的 UITableview 中部分的显示顺序?【英文标题】:How do I change the display order of sections in a UITableview populated from an NSFetchedResultsControler? 【发布时间】:2010-08-27 11:37:21 【问题描述】:

我想知道是否有人知道为 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 的属性的示例:但是这些示例仍然倾向于提供按字母顺序列出的部分名称。

这显然是我的新手,但任何建议/方向将不胜感激。

【问题讨论】:

【参考方案1】:

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

来自NSFetchedResultsController 类文档:

如果您想自定义部分和索引标题的创建,您可以创建此类的子类。你覆盖 sectionIndexTitleForSectionName:如果 您希望部分索引标题为 大写以外的东西 部分名称的第一个字母。你 如果你覆盖 sectionIndexTitles 希望索引标题成为某种东西 除了由创建的数组 打电话 sectionIndexTitleForSectionName: on 所有已知的部分。

它有点隐蔽,所以您会错过前几次阅读有关该课程的信息。

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何更改从 NSFetchedResultsControler 填充的 UITableview 中部分的显示顺序?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 AppDelegate 更改 UINavigationBar 背景颜色

如何从 ViewModel 更改样式属性?

如何从匿名内部类更改外部变量?

如何从片段更改 Tablayout 的背景颜色?

当用户从 android 设置应用程序更改显示大小时,如何防止应用程序布局更改?

如何从scala中的地图更改键