- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我遇到了一些麻烦,我想知道是否有人可以提供一些指导。
我正在尝试按以下顺序创建节标题:["Push"、"Busy"、"Finished"、"Canceled"]。
不幸的是,这个顺序不能用简单的“升序是/否”来实现......我必须添加一个自定义比较选择器......像这样......:
**“states”映射到 [“Push”、“Busy”、“Finished”、“Canceled”]
NSSortDescriptor *sortStates = [NSSortDescriptor sortDescriptorWithKey:@"states"
ascending:NO
selector:@selector(compareCustom:)];
因此,我实现了一个“compareCustom”...然而,结果是我无法实现一个自定义排序器,因为出现了以下异常结果:
*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不支持的 NSSortDescriptor 选择器:compareCustom:”
作为引用,sortDate 的实现方式是:
request.sortDescriptors = @[sortStates]
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:context
sectionNameKeyPath:@"states"
cacheName:nil];
看来我无法实现返回 NSComparisonResult 的 compareCustom?我觉得这应该是可能的..但我无法弄清楚如何。如果有人可以提供一些建议,我将不胜感激!
也供引用,这是我的“compareCustom”方法
-(NSComparisonResult)compareCustom:(NSString *)anotherState {
if ([(NSString *)self isEqualToString:@"Push"] && [anotherState isEqualToString:@"Canceled"]) {
return NSOrderedDescending;
}
else if ([(NSString *)self isEqualToString:@"Push"] && [anotherState isEqualToString:@"Busy"]) {
return NSOrderedDescending;
}
else if ([(NSString *)self isEqualToString:@"Push"] && [anotherState isEqualToString:@"Finished"]) {
return NSOrderedDescending;
}
else if ([(NSString *)self isEqualToString:@"Push"] && [anotherState isEqualToString:@"Push"]) {
return NSOrderedSame;
}
else if ([(NSString *)self isEqualToString:@"Finished"] && [anotherState isEqualToString:@"Canceled"]) {
return NSOrderedDescending;
}
else if ([(NSString *)self isEqualToString:@"Finished"] && [anotherState isEqualToString:@"Busy"]) {
return NSOrderedAscending;
}
else if ([(NSString *)self isEqualToString:@"Finished"] && [anotherState isEqualToString:@"Finished"]) {
return NSOrderedSame;
}
else if ([(NSString *)self isEqualToString:@"Finished"] && [anotherState isEqualToString:@"Push"]) {
return NSOrderedAscending;
}
else if ([(NSString *)self isEqualToString:@"Busy"] && [anotherState isEqualToString:@"Finished"]) {
return NSOrderedDescending;
}
else if ([(NSString *)self isEqualToString:@"Busy"] && [anotherState isEqualToString:@"Canceled"]) {
return NSOrderedDescending;
}
else if ([(NSString *)self isEqualToString:@"Busy"] && [anotherState isEqualToString:@"Busy"]) {
return NSOrderedSame;
}
else if ([(NSString *)self isEqualToString:@"Busy"] && [anotherState isEqualToString:@"Push"]) {
return NSOrderedAscending;
}
else {
return NSOrderedSame;
}
}
最佳答案
根据documentation自定义排序不适用于 SQLite 持久存储:
The SQL store, on the other hand, compiles the predicate and sort descriptors to SQL and evaluates the result in the database itself. This is done primarily for performance, but it means that evaluation happens in a non-Cocoa environment, and so sort descriptors (or predicates) that rely on Cocoa cannot work. The supported sort selectors are compare: and caseInsensitiveCompare:, localizedCompare:, localizedCaseInsensitiveCompare:, and localizedStandardCompare: (the latter is Finder-like sorting, and what most people should use most of the time). In addition you cannot sort on transient properties using the SQLite store.
所以看起来您不能简单地强制 NSFetchedResultsController
以字母顺序以外的顺序显示部分。
但是您可以使用变通方法。向您的实体添加额外的、持久的整数类型属性(我们称之为 sectionOrder
)。根据 states
属性设置其值(因此 "Push"
为 0,"Busy"
为 1 等)您可以例如,在 awakeFromInsert
方法中执行此操作。
然后使用 @"sectionOrder"
作为 sectionNameKeyPath
和排序描述符中的键路径。您可以使用此 UITableViewDataSource
方法将部分标题设置为“Push”、“Busy”等:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section];
return [sectionInfo.objects.firstObject name];
}
致谢excellent answer .
关于ios - NSSortDescriptor 和 NSFetchedResultsController 的自定义选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27969763/
我有一个实体类型,作为其属性之一,它具有单个字符。我想检索与谓词匹配的所有此类实体,并且希望它们首先按该字符排序,然后按索引号(这是其另一个属性)排序。 如果我只使用内置的排序描述符,这很简单....
我正在使用 NSSortdescriptor 对 NSArray 集合进行排序,然后我遇到了一种情况,其中要排序的特定 NSArray 包含一个 NSDictionary,而该 NSDictionar
那东西是使用冒泡排序吗?或者到底是什么?它如何在核心数据的 NSFetchRequest 上下文中工作? 最佳答案 NSSortDescriptor API 不指定算法(或者甚至,比如几乎所有的 Co
我有两种类型的反对意见:地点和历史项目。我正在尝试获取附加到任何历史记录项的位置,因此该位置的获取谓词是“history.@count > 0”,效果很好。 我还想使用 NSSortDescripto
我有一个 NSFetchRequest从核心数据中获取对象并使用简单的 NSSortDescriptor 对它们进行排序.根据用户的选择,我使用了几种不同的方法,但它们是这样的: NSMuta
我有一个带有显示地址 View 的 CoreData iphone 应用程序。 地址如下所示:“5 Blob Street, 2222, Suburbia”,其中“5 Blob Street”是 ad
我正在尝试对实体文件夹执行提取请求,并且我希望名为 xyz 的文件夹成为排序时的最后一个对象。 NSFetchRequest *fetchRequest = [[NSFetchRequest al
我正在使用 FetchedResultsController 来执行我的提取,我希望它按降序对对象进行排序。如果我在创建 NSSortDescriptor 时使用自定义比较器 block ,我会收到错
首先,这是我的数据结构(简化): CATEGORY -name -subcategories <- this is a to many relationship to SUBCATE
我正在使用 UIActionSheet 按其中一个键对数组中的 100 个词典进行排序。一些键是 NSStrings,另一些是 NSNumbers。这段代码完成了这项工作: -(void)action
我目前正在对名为“视频”的实体进行排序。我试图首先按格式为“2013 年 12 月 21 日”的记录日期对所有视频进行排序,然后是标题,它只是一个字符串。这是我正在使用的代码: - (void)vie
我正在尝试获取“Contractor”的实体。 Contractor 与另一个名为“Job”的实体存在一对多关系。所以一个承包商可以有很多工作。 我将如何创建 NSSortDescriptor,以便我
我有一组从服务器获取的自定义对象。 我想根据成本对数据进行排序。它们是我的数组中的一个 totalCost 字段,类型为 NSString。 现在我像这样使用 NSSortDescriptor:
我有一本字典,我想根据 firstName 按字母顺序排序: { id = 123; user = { firstName = "Test 15";
我想对用户创建的联系人进行排序,其中联系人的数据是大杂烩。某些联系人可能填写了每个字段或属性,例如lastName、firstName、公司、电话、电子邮件,而其他人可能只有名字、电子邮件或公司。 使
我正在使用 sortDescriptor 对我的 NSFetchRequest 结果进行排序。我正在做这个。 NSFetchRequest *request = [NSFetchRequest fet
我有一个名为“TruckNumber”的核心数据实体,它有一个字符串,因为它是唯一的属性。该字符串通常是 1-3 位整数(作为字符串),但有时可以包含字母,例如 TMP9。该属性的名称是“itsNot
我正在制作一个 NSFetchRequest 并希望我的结果按日期从 Core Data 返回。 dateLastViewed 属性是 Core Data 中的一个 NSDate,因此,我希望我的 c
我的数据模型是这样的: User (Entity) - valueOne (NSNumber Attribute) - valueTwo (NSNumber Attribute) 我正在使用 NSFe
在我的核心数据中,我要求 x 个按距离 (NSNumber[double]) 升序排序的对象。问题是它还给我返回负数。我知道这是有道理的,但我只想要正数,我该怎么做? NSManagedObjectC
我是一名优秀的程序员,十分优秀!