【问题标题】:Problem with NSSortDescriptor using custom comparator via selector通过选择器使用自定义比较器的 NSSortDescriptor 问题
【发布时间】:2011-03-15 09:11:53
【问题描述】:

我想使用带有自定义比较器的排序描述符

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:]: unrecognized selector sent .....

我做错了什么? 如果我在一个块中使用比较器,它就可以工作,但我需要它通过选择器工作。 我找不到任何示例代码或有关如何通过选择器使用比较器的清晰文档(适用于 iOS 3.x.x)。该文档谈到了与自我比较,但我试图将比较方法合并到对象中,但这也不起作用。

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

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

【问题讨论】:

    标签: iphone selector nssortdescriptor


    【解决方案1】:

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

    来自 NSSortDescriptor 文档:

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

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

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

    如果您不关心 iOS 版本

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

    cmptr 是这样的块:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      相关资源
      最近更新 更多