gpt4 book ai didi

ios - NSFetchedResultController 按多个键对 TableView 部分进行排序

转载 作者:行者123 更新时间:2023-11-29 03:31:50 25 4
gpt4 key购买 nike

问题:

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

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

例如,考虑我在数据库中拥有列表的所有实例,如下所示:

系统列表:收件箱

用户列表:FruitListShoppingList

预期结果是:

  • 收件箱
    • InboxItem1
    • InboxItem2
  • 水果列表
    • FruitListItem1
  • 购物 list
    • 苹果
    • 橙色

方法:

使用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 时都会面临的常见问题。

有什么输入吗?!!!

最佳答案

您可以将 sectionIdentifier 之类的 transient 属性添加到 List 实体并按如下方式排序:使用

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

作为第一个排序描述符。

sectionIdentifier 可以是任何可以按照您想要的方式排序的内容(首先是“系统”),并且您可以从中重建正确的节名称以在 titleForHeaderInSection 中返回。

关于ios - NSFetchedResultController 按多个键对 TableView 部分进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19673572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com