使用自定义比较器通过选择器的NSSortDescriptor问题

P5y*_*cH0 9 iphone selector nssortdescriptor

我想使用带有自定义比较器的sortdescriptor

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
    initWithKey:@"object.dateTime" 
    ascending:YES 
    selector:@selector(compareObject:toObject:)];
Run Code Online (Sandbox Code Playgroud)

(关键是ManagedObject)

比较法:

- (NSComparisonResult)compareObject:(id)date1 toObject:(id)date2 {
    NSComparisonResult comparisonResult;
    // Complex comparator contents
    return comparisonResult;
}
Run Code Online (Sandbox Code Playgroud)

但是,我得到一个错误:'NSInvalidArgumentException',原因:' - [__ NSDate compareObject:toObject:]:无法识别的选择器发送.....

我究竟做错了什么?如果我在块中使用它,比较器可以工作,但我需要它通过选择器工作.我找不到任何示例代码或有关如何通过选择器使用比较器的明确文档(适用于iOS 3.xx).文档讨论了与self进行比较,但我尝试将compare方法合并到object中,但这也没有用.

谁可以指出我的问题或一些示例代码,如何通过选择器使用它?

注意:比较器本身不是简单的日期比较.那里还有很多事情要发生.

Jil*_*ouc 9

如果要比较NSDate对象,则传递的选择器必须是NSDate类的方法,并且只接受一个参数.

从NSSortDescriptor doc:

选择器必须指定由keyPath标识的属性值实现的方法.用于比较的选择器传递单个参数.

要提供自己的排序选择器,您应该在NSDate上定义一个类别,并将自定义排序方法放在这里

- (NSComparisonResult)customCompare:(id)toDate {
    NSComparisonResult comparisonResult;
    // Complex comparator contents
    return comparisonResult;
}
Run Code Online (Sandbox Code Playgroud)

或者如果你不关心iOS版本<4.0,你也可以使用

- (id)initWithKey:(NSString *)key ascending:(BOOL)ascending comparator:(NSComparator)cmptr
Run Code Online (Sandbox Code Playgroud)

cmptr 像这样的块:

^(id date1, id date2) {
    NSComparisonResult comparisonResult;
    // Complex comparator contents
    return comparisonResult;
}
Run Code Online (Sandbox Code Playgroud)