Сортировка массива с использованием дескрипторов выдает valueForUndefinedKey

#cocoa #key-value-coding #nssortdescriptor

#cocoa #кодирование ключа-значения #nssortdescriptor

Вопрос:

Я пытаюсь отсортировать NSMutableArray объектов YOEvento.

YOEvento.h

 @interface YOEvento : NSObject
{
    NSString *nombre; // stores the <name> tag
    NSDate *diaDeInicio; // stores the tag <dia-de-inicio>
    NSDate *diaDeFin; // stores the tag <dia-de-fin>
    NSString *entradilla; // stores the tag <entradilla>
}
@property (nonatomic, retain) NSString *nombre;
@property (nonatomic, retain) NSDate *diaDeInicio;
@property (nonatomic, retain) NSDate *diaDeFin;
@property (nonatomic, retain) NSString *entradilla;
@end
  

YOEvento.m

 #import "YOEvento.h"
@implementation YOEvento
@synthesize nombre, diaDeInicio, diaDeFin, entradilla;
etc...
  

Массив объявляется в делегате приложения, как показано здесь:

 NSMutableArray *eventosParsed;
@property (nonatomic, retain) NSMutableArray *eventosParsed;
@synthesize eventosParsed;
  

После заполнения массива я пытаюсь отсортировать его по diaDeInicio:

 NSSortDescriptor *descriptorByDate = [[NSSortDescriptor alloc] initWithKey:@"diaDeInicio" ascending:YES];
NSArray *descriptorsArray = [NSArray arrayWithObject:descriptorByDate];
[self.eventosParsed sortedArrayUsingDescriptors:descriptorsArray];
[descriptorByDate  release];
  

Но после попытки выполнить инструкцию [self.eventosParsed sortedArrayUsingDescriptors:descriptorsArray]; я получаю сигнал SIGABRT и следующее сообщение в консоли:

 'NSUnknownKeyException', reason: '[<NSCFString 0x4b564b0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key diaDeInicio.'
  

Я проверил содержимое массива перед инструкцией, и, похоже, он заполнен хорошо сформированными объектами YOEvento, это копия и вставка из информации отладчика о свойстве eventosParsed первого элемента. Значения не отображаются, но каждая переменная экземпляра в объекте YOEvento имеет правильное значение.

 eventosParsed   __NSArrayM *    0x4e900e0
0   YOEvento *  0x4ea3660
    NSObject    NSObject    {...}
    nombre          NSCFString *    0x4ea37e0
    diaDeInicio __NSDate *  0x4ea7370
    diaDeFin    __NSDate *  0x4ea6630
    entradilla  NSCFString *    0x4ea3c50
  

Ответ №1:

Вы пытаетесь отсортировать свой массив по ключу @"diaDeInicio" , но, как указано в сообщении:

 -[<NSCFString 0x4b564b0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key diaDeInicio.
  

Строки не имеют этого ключа. У вас есть массив строк, поэтому вы не можете сортировать по этому ключу.

Заполните массив объектами YOEvento вместо строк, и тогда вы сможете отсортировать массив по этому ключу.

Комментарии:

1. Я проверил массив eventosParsed перед инструкцией, и он заполнен хорошо сформированными объектами YOEvento.

2. @DavidCasillas: И все же вы получаете это исключение. В то время, когда вы пытаетесь его отсортировать, в массиве есть по крайней мере одна строка, или вы смотрите на массив, отличный от того, который вы пытаетесь отсортировать.