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

时间:2011-03-15 09:11:53

标签: iphone selector nssortdescriptor

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

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

(键是ManagedObject)

比较法:

- (NSComparisonResult)compareObject:(id)date1 toObject:(id)date2 {
    NSComparisonResult comparisonResult;
    // Complex comparator contents
    return comparisonResult;
}

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

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

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

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

1 个答案:

答案 0 :(得分:9)

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

来自NSSortDescriptor doc:

  

选择器必须指定方法   由价值实现   keyPath标识的属性。该   用于比较的选择器是   传递了一个参数。

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

- (NSComparisonResult)customCompare:(id)toDate {
    NSComparisonResult comparisonResult;
    // Complex comparator contents
    return comparisonResult;
}

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

- (id)initWithKey:(NSString *)key ascending:(BOOL)ascending comparator:(NSComparator)cmptr

cmptr是这样的一个块:

^(id date1, id date2) {
    NSComparisonResult comparisonResult;
    // Complex comparator contents
    return comparisonResult;
}