iOS 中的自定义排序,希望在 Coredata 的顶部显示默认(所有组)标题
Custom sort in iOS, want to show default(All Group) title on top from Coredata
我在 NSFetchedResultController
中使用核心数据。在这种情况下,我有 n
个用户组,用户可以 select 个特定组或 select 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
总是排在最前面?
额外:我正在使用 table 带有搜索选项的视图
示例:@[@1, @5, @"text", @"aaaaaaa", @"All group"]
。这里 All group
总是显示在列表的顶部。我怎样才能这样排序。
输出:@[@"All group", @1, @5, @"aaaaaaa", @"text"]
你我都知道'All group'是特殊的,因为我们读懂了这个词,但是核心数据无法知道'All group'是特殊的;它只看到它以 "A" 开头。您可以将另一个 属性 添加到您的实体 isAllGroup
并首先按它排序,然后按 assetGroupName
排序。
或者您可以有一个 属性 'groupOrder',对于 "all Group" 为 0,对于所有其他组为 100。这允许您有更多空间来进行其他特殊团体订购,而无需创建新的 属性.
一种更通用的方法是添加 属性 assetGroupNameForSort
并按其排序,而不是仅用于显示的 assetGroupName
。对于大多数组,值是相同的,但对于 "All Group",它是“__All 组”或类似的东西。这也可用于修复使用不同语言的名称以您不希望的方式排序时可能发生的问题。
我会推荐第一种方法,只需添加一个 'isAllGroup' 属性。最简单,数据一目了然
另外:小问题 - fetchedResultsController 不遵守 FetchBatchSize,因此您可以将其删除。
我在 NSFetchedResultController
中使用核心数据。在这种情况下,我有 n
个用户组,用户可以 select 个特定组或 select 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
总是排在最前面?
额外:我正在使用 table 带有搜索选项的视图
示例:@[@1, @5, @"text", @"aaaaaaa", @"All group"]
。这里 All group
总是显示在列表的顶部。我怎样才能这样排序。
输出:@[@"All group", @1, @5, @"aaaaaaa", @"text"]
你我都知道'All group'是特殊的,因为我们读懂了这个词,但是核心数据无法知道'All group'是特殊的;它只看到它以 "A" 开头。您可以将另一个 属性 添加到您的实体 isAllGroup
并首先按它排序,然后按 assetGroupName
排序。
或者您可以有一个 属性 'groupOrder',对于 "all Group" 为 0,对于所有其他组为 100。这允许您有更多空间来进行其他特殊团体订购,而无需创建新的 属性.
一种更通用的方法是添加 属性 assetGroupNameForSort
并按其排序,而不是仅用于显示的 assetGroupName
。对于大多数组,值是相同的,但对于 "All Group",它是“__All 组”或类似的东西。这也可用于修复使用不同语言的名称以您不希望的方式排序时可能发生的问题。
我会推荐第一种方法,只需添加一个 'isAllGroup' 属性。最简单,数据一目了然
另外:小问题 - fetchedResultsController 不遵守 FetchBatchSize,因此您可以将其删除。