Проблема с NSSortDescriptor при использовании пользовательского компаратора через селектор - PullRequest
9 голосов
/ 15 марта 2011

Я хочу использовать 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, но я попытался включить метод сравнения в объект, но это тоже не сработало.

Кто может указать мне на мою проблему или на пример кода о том, как использовать это через селектор?

Примечание: сам компаратор не является простым сравнением дат. Там происходит намного больше.

1 Ответ

9 голосов
/ 15 марта 2011

Если вы сравниваете NSDate объекты, передаваемый вами селектор должен быть методом класса NSDate и принимать только один аргумент.

Из документа NSSortDescriptor:

Селектор должен указывать метод, реализованный значением свойства, идентифицируемого keyPath.Селектору, используемому для сравнения, передается один параметр.

Чтобы предоставить свой собственный селектор сортировки, вы должны определить категорию в NSDate и разместить здесь свой собственный метод сортировки, например

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

ИЛИ Если вас не интересуют версии iOS <4.0, вы также можете использовать </p>

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

cmptr, например, такой блок:

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