Какао KVC: "класс не соответствует кодировке значения ключа" - PullRequest
2 голосов
/ 08 июля 2009

Я пытаюсь обновить некоторые свойства с помощью KVC. Свойства были синтезированы.

Эта строка работает:

myObject.value = intValue;

Это не работает:

[self setValue:[NSNumber numberWithInt:intValue] forKey:@"myObject.value"];

И взрывается с: Завершение приложения из-за необработанного исключения 'NSUnknownKeyException', причина: '[ setValue: forUndefinedKey:]: этот класс не соответствует значению ключа, соответствующему кодированию для ключа myObject.value .

Еще дальше по методу (awakeFromNib) другие экземпляры того же класса нормально реагируют на вызовы setValue: forKey:. Разница лишь в том, что этот конкретный экземпляр был создан и подключен в IB.

Ответы [ 3 ]

9 голосов
/ 08 июля 2009

Вы не можете передать путь ключа в качестве второго аргумента -[NSObject setValue:forKey:]. Вы хотите использовать setValue:forKeyPath: вместо:

[self setValue:[NSNumber numberWithInt:intValue] forKeyPath:@"myObject.value"];

Насколько я понимаю, setValue:forKey: предоставляется для оптимизации производительности. Поскольку он не может пройти по ключевому пути, ему не нужно анализировать строку ключа.

7 голосов
/ 08 июля 2009

Он говорит вам, что это недопустимый ключ для этого объекта, и на самом деле это не так: «myObject.value» - это путь к ключу, а не один ключ.

1 голос
/ 08 июля 2009

Я согласен с Чаком.

Я думаю, вам нужно сделать это вместо:

[self setValue:[NSNumber numberWithInt:intValue] forKeyPath:@"myObject.value"];

или через каждую часть ключевого пути, например:

id myObject = [self objectForKey:@"myObject"];
[myObject setValue:[NSNumber numberWithInt:intValue] forKey:@"value"];
...