iOS中的自定义排序,希望在Coredata的顶部显示默认(所有组)标题

Posted

技术标签:

【中文标题】iOS中的自定义排序,希望在Coredata的顶部显示默认(所有组)标题【英文标题】:Custom sort in iOS, want to show default(All Group) title on top from Coredata 【发布时间】:2017-06-07 10:59:33 【问题描述】:

我正在使用NSFetchedResultController 的核心数据。在这种情况下,我有n 数量的用户组,用户可以选择特定组或选择all group。所以我手动将All group 标题、static ID 和相关内容添加到数据库中。

NSFetchRequest <IRSUserAssetGroup *> *fetchRequest = [NSFetchRequest fetchRequestWithEntityName: [IRSUserAssetGroup entityName]];

NSSortDescriptor *nameSortDescriptor = [NSSortDescriptor sortDescriptorWithKey: NSStringFromSelector(@selector(assetGroupName))
                                                                     ascending: YES
                                                                      selector: @selector(localizedCaseInsensitiveCompare:)];

[fetchRequest setSortDescriptors: @[nameSortDescriptor]];

[fetchRequest setFetchBatchSize: 4];

NSManagedObjectContext *mainContext = [[IRSCoreDataManager sharedManager] managedObjectContext];

NSFetchedResultsController <IRSUserAssetGroup *> *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest
                                                                                                                 managedObjectContext: mainContext
                                                                                                                   sectionNameKeyPath: nil
                                                                                                                            cacheName: nil];

NSError *fetchError = nil;

if (![fetchedResultsController performFetch: &fetchError])
    FCALog(@"fetch error: %@", fetchError);

[self setUserAssetGroupFetchedResultsController: fetchedResultsController];

这是我的FRC 代码。我正在使用按名称排序。一些组名以数字开头。因为这个All group没有放在第一位。

这可能All group 总是排在首位吗?

额外:我正在使用带有搜索选项的表格视图

例如:@[@1, @5, @"text", @"aaaaaaa", @"All group"]。这里All group 总是显示在列表的顶部。我怎么能这样排序。

输出:@[@"All group", @1, @5, @"aaaaaaa", @"text"]

【问题讨论】:

不要在数据模型中解决这个问题,而是在TableViewDataSource中手动添加静态单元格。所以索引 0 处的对象是你 All groups 单元格,只要记住在从 FetchedresultsController 抓取项目时从索引中减去 1。 谢谢。现在,我只是在工作。您如何看待@jonRose 的回答?哪个好,比如效率、速度等, 正如我之前提到的,All group 是静态的ID,现在我添加了 NSPredicate *allGroupPredicate = [NSPredicate predicateWithFormat:@"%K != %d", NSStringFromSelector(@selector(assetGroupID)), allUserGroupID]; 并以此为谓词。在cellForRowAtIndexPath 上为All group 设置静态单元格。这就是你想要表达的意思吗? 【参考方案1】:

你和我都知道'All group'是特殊的,因为我们读懂了这个词,但核心数据无法知道'All group'是特殊的;它所看到的一切都是以“A”开头的。您可以将另一个属性添加到您的实体isAllGroup 并首先按此排序,然后按assetGroupName

或者您可以拥有一个属性“groupOrder”,对于“所有组”,该属性为 0,对于所有其他组,该属性为 100。这让您有更多空间来进行其他特殊团体订购,而无需创建新属性。

更通用的方法是添加属性assetGroupNameForSort 并按其排序,而不是仅用于显示的assetGroupName。对于大多数组,值是相同的,但对于“All Group”,它是“__All Group”或类似的东西。这也可用于修复使用不同语言的名称可能发生的问题,这些名称以您不期望的方式排序。

我会推荐第一种方法,只需添加一个“isAllGroup”属性。是最简单的,数据也很容易理解。

另外:小问题 - fetchedResultsController 不尊重 FetchBatchSize,因此您可以将其删除。

【讨论】:

感谢您指出小问题。你能解释一下为什么吗?因为FetchBatchSize 也是获取结果的一部分意味着NSFetchRequest 我不想为这个小改动更新(或版本控制)数据库。所以我要添加另一个AND 谓词NSPredicate *allGroupPredicate = [NSPredicate predicateWithFormat:@"%K != %d", NSStringFromSelector(@selector(assetGroupID)), allUserGroupID];。开启cellForRowAtIndexPathAll group 设置静态单元格。再次感谢您提供更多排序选项。 如果 fetchedResultsController 尊重 batchSize,因为苹果没有写它尊重 batchSize。我猜他们这样做是因为它会给代码增加大量的复杂性。例如,如果有插入,它也会导致删除(因为它超过了 batchSize)。 我认为你不应该害怕版本模型。即使是很小的变化,我也会一直这样做。 再次感谢您的解释。以前我没有尝试过版本模型。这就是为什么。好的,让我给版本模型一个镜头。 (心声)在功能上,苹果可能会考虑这种排序方式。小分类的东西,但很少手动工作。

以上是关于iOS中的自定义排序,希望在Coredata的顶部显示默认(所有组)标题的主要内容,如果未能解决你的问题,请参考以下文章

IOS:将viewcontroller添加到ios中的自定义TabBar

CAML查询中的自定义排序顺序

在 Swift 中的自定义单元格中存储/检索核心数据

输入焦点时在 iOS(和所有移动设备)上的自定义滚动

道具不会传递给 React Native Navigation v2 中的自定义顶部栏标题组件

ios 顶部带有标签栏的自定义 uitableview