0

问题

在我的 CoreData 模型中,我有两个名为 List 和 Item 的实体,它们具有一对多的关系。在我目前的设计中有两种类型的列表,系统列表和用户列表。系统列表由系统在首次启动时创建,用户列表将由用户随时创建。

在我的 TVC 中,我想展示所有按其关联列表分组的项目(使用列表名称作为部分标题),此外,我希望所有系统列表始终放在用户列表的顶部。

例如,考虑我在 DB 中有所有列表实例,如下所示:

系统列表:收件箱

用户列表:FruitList , ShoppingList

预期结果将是:

  • 收件箱
    • 收件箱项目 1
    • 收件箱项目2
  • 水果清单
    • FruitListItem1
  • 购物清单
    • 苹果
    • 橙子

该方法:

使用 FRC,我可以通过将 sectionNameKeyPath 设置为 FRC 的“list_name”来实现第一个目标。但是我在固定系统列表的位置时遇到了问题(在这种情况下,收件箱应该始终位于索引 0)。但是,问题出现在用户输入名称以“A”-“J”开头的列表时,所有这些列表都将放在收件箱的顶部,我确实尝试通过添加“list_type”作为辅助排序键来修复它,但它不起作用。

NSFetchRequest *requst = [[NSFetchRequest alloc]initWithEntityName:ENTITY_ITEM];

NSArray *sortDescriptors = @[
                                [NSSortDescriptor sortDescriptorWithKey:@"belongsToList.list_name" ascending:YES],
                                [NSSortDescriptor sortDescriptorWithKey:@"belongsToList.list_type" ascending:NO]];

requst.sortDescriptors = sortDescriptors;
requst.predicate = [self predicateForListType:type selectedList:list];
requst.fetchBatchSize = 20;

_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:requst managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"belongsToList.list_name" cacheName:nil];

临时解决方案:

我能想到的解决此问题的临时解决方案是将前缀字符串添加到列表名称中,并将它们存储为数据库中的另一个属性并将其用作 sectionNameKeyPath。

例如“0-” - 用于系统列表(“收件箱” -> “0-收件箱”)

"1-" - 用户列表 ("ShoppingList" -> "1-ShoppingList")

并删除-tableView:titleForHeaderInSection:. 但是这个解决方案会产生开销,我认为应该有更好的解决方案,因为这是所有开发人员在处理 FRC 和 TBV 时都会面临的常见问题。

有输入吗???!!!

4

1 回答 1

1

您可以sectionIdentifierList实体添加一个瞬态属性,并按如下方式排序:使用

[NSSortDescriptor sortDescriptorWithKey:@"list.sectionIdentifier" ascending:YES]

作为第一个排序描述符。

sectionIdentifier 可以是任何按您想要的方式排序的东西(首先是“系统”),并且您可以从中重建正确的部分名称以返回titleForHeaderInSection.

于 2013-10-30T09:33:53.123 回答