Iphone 使用NSSortDescriptor定制订单
假设我有不同状态的对象。状态从0到2。我需要使用NSSortDescriptor按以下方式对它们进行排序: 一, 二, 0Iphone 使用NSSortDescriptor定制订单,iphone,xcode,nssortdescriptor,Iphone,Xcode,Nssortdescriptor,假设我有不同状态的对象。状态从0到2。我需要使用NSSortDescriptor按以下方式对它们进行排序: 一, 二, 0 有什么建议吗?使用自定义比较器或选择器NSSortDescriptor提供了一些您应该了解的方法。从: 但是,如果将此类排序描述符传递给核心数据获取请求,则可能会遇到问题。类似于以下内容(未测试): 谢谢你,没关系,但是你能帮我做一下“这里所有的自定义比较逻辑”吗。我是个新手…这是一个NSNumber,所以你需要integerValue得到一个简单的整数。将它们与进行比较,
有什么建议吗?使用自定义比较器或选择器
NSSortDescriptor
提供了一些您应该了解的方法。从:
但是,如果将此类排序描述符传递给核心数据获取请求,则可能会遇到问题。类似于以下内容(未测试):
谢谢你,没关系,但是你能帮我做一下“这里所有的自定义比较逻辑”吗。我是个新手…这是一个NSNumber,所以你需要
integerValue
得到一个简单的整数。将它们与进行比较,并根据您希望的订购方式返回传感器解除搜索
、传感器解除搜索
或传感器解除搜索
。在您的例子中,如果[self integerValue]
是1,那么它总是去排序
(因为我们已经检查了相等性)。如果它是0,那么它总是去下移
。如果是2,则需要检查其他值以确定返回哪个值。无法在类别中获取要调用的描述符(customStatusCompare:)。您看到了什么错误?您确定正在编译提供实现的.m文件吗?您是否将@interface.h包含到引用customStatusCompare:
的文件中?我已经让它工作了,成功与否取决于您传递状态的顺序。我需要一个独立的分拣机。这是我的代码:-(NSComparisonResult)customStatusCompare:(NSNumber*)status{if([self-isEqual:status]){return-sensorderedname;}else-if([self-isEqual:[NSNumber-whithint:2]]){return sensorderedname;}else-if([self isEqual NSNumber-numberwhithint:1]]){return sensorderedname;}否则如果([self isEqual:[NSNumber numberwhithint:0]]){return sensorderedescending;}return 0;}@endWe似乎有这些核心数据获取请求“问题”。你能详细说明原因吗?核心数据只是抛出了一个异常。排序描述符是什么样子的?不能对核心数据获取请求使用自定义选择器或比较器。明白了。谢谢我们试着用一个比较仪。
+ sortDescriptorWithKey:ascending:selector:
– initWithKey:ascending:selector:
+ sortDescriptorWithKey:ascending:comparator:
– initWithKey:ascending:comparator:
descriptor = [[[NSSortDescriptor alloc]
initWithKey:@"status"
ascending:YES
selector:@selector(customStatusCompare:)] autorelease];
@interface NSNumber (CustomStatusCompare)
- (NSComparisonResult)customStatusCompare:(NSNumber*)other;
@end
@implementation NSNumber (CustomStatusCompare)
- (NSComparisonResult)customStatusCompare:(NSNumber*)other {
NSAssert([other isKindOfClass:[NSNumber class]], @"Must be a number");
if ([self isEqual:other]) {
return NSOrderedSame;
}
else if (... all your custom comparison logic here ...)
}
}