iPhone приложение сбой с nsunknownkeyexception setValue: forUndefinedKey: [дубликат]

этот вопрос уже есть ответ здесь:

Я пишу свое первое приложение для iPhone, поэтому мне не удалось выяснить многое на пути отладки. По сути мое приложение отображает изображение и при прикосновении воспроизводит короткий звук. При компиляции и создании проекта в XCode все строится успешно, но когда приложение запускается в симуляторе iPhone, оно аварийно завершает работу.

Я получаю следующую ошибку:

Application Specific Information:
iPhone Simulator 1.0 (70), iPhone OS 2.0 (5A331)
*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason: '[<UIView 0x34efd0> setValue:forUndefinedKey:]: this class is not key value 
coding-compliant for the key kramerImage.'

kramerImage вот изображение, которое я использую для фона.

Я не уверен, что означает NSUnknownKeyException или почему класс не соответствует кодированию ключевого значения для ключа.

8 ответов


(это не совсем специфично для iPhone - то же самое произойдет в обычном какао).

NSUnknownKeyException является распространенной ошибкой, при использовании Кодирование Ключевых Значений для доступа к ключу, которого у объекта нет.

свойства большинства объектов Cocoa могут быть доступны напрямую:

[@"hello world" length]    // Objective-C 1.0
@"hello world".length      // Objective-C 2.0

или через Кодирвоание ключ-значения:

[@"hello world" valueForKey:@"length"]

Я бы получил исключение NSUnknownKeyException, если бы я использовал следующее строка:

[@"hello world" valueForKey:@"purpleMonkeyDishwasher"]

потому что NSString не имеет свойства (ключа), называемого 'purpleMonkeyDishwasher'.

что-то в вашем коде пытается установить значение для ключа "kramerImage" на UIView, который (по-видимому) не поддерживает этот ключ. Если вы используете Interface Builder, это может быть что-то в вашем перо.

найдите, где используется "kramerImage", и попробуйте отследить его оттуда.


также при переименовании представления не забудьте удалить ссылку на владельца файла. Это также может вызвать эту ошибку.


вот где вы получите эту ошибку и как это исправить. Я получал его при загрузке пера, у которого только что был пользовательский TableViewCell. Я использовал IB для создания xib, у которого был только владелец файла, первый ответчик и TableViewCell. TableViewCell только что имел 4 UILabels, которые соответствовали классу с 4 UILabels IBOutlet под названием rootCell. Я изменил класс TableViewCell на rootCell. Он работал нормально, пока не сделал пару изменений, и внезапно я получил setValue: forUndefinedKey: когда я просто создавал экземпляр класса после загрузки его из nib:

    NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"rootCell-iPad" owner:self options:nil];

    cell = [nib objectAtIndex:0];

это не удалось в первой строке, когда перо пыталось загрузить. Через некоторое время я заметил, что он пытается сопоставить метки IBOutlet с корневым контроллером, а не классом rootCell! Это был мой совет. Что я сделал неправильно, так это непреднамеренно изменить владельца файла на класс rootCell. Когда я изменил его обратно на NSObject, он не пытался соответствовать делегату (rootController) при загрузке. Итак, если вы делаете выше, сделайте владельца файла NSObject, но сделайте UITableCell желаемым классом.


У меня была эта ситуация, и оказывается, даже после нахождения всех экземпляров переменной и их удаления мое приложение все равно разбилось. Heres то, что произошло... Я создал еще один экземпляр переменной из текстового поля из моего XIB в мой viewController.h но я понял, что он мне больше не нужен, и удалил его. Оказывается, моя программа увидела это и продолжала пытаться использовать его в программе, поэтому в будущем, если это произойдет где-нибудь еще, просто зайдите в вас XIB правой кнопкой мыши на кнопке или текстовом поле etc и удалить любые дополнительные неиспользуемые переменные.


У меня была такая же проблема сегодня. У меня не было правильного класса, указанного для контроллера вида в моем навигационном контроллере. Это часто происходит, если вы не можете указать правильный класс для своих представлений в Interface Builder.

вы также получите недействительные вопросы селектора, а также. Всегда проверяйте классы и соединения Interface Builder!


вот как я решил мой, в Interface builder щелкните правой кнопкой мыши контроллер вида, должен быть восклицательный знак на отсутствующей розетке или методе действия. Найдите и удалите все ссылки, и это решило его.

Это произошло потому, что я удалил метод действий .m-файл.


Кажется, вы делаете

@interface MyFirstIphoneAppViewController : UIViewController<> {
    UIImageView *InitialkramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage;

затем после синтеза этого imageview, когда вы открываете " MyFirstIphoneAppViewController.xib " в Interface Builder вы получаете представление изображения из инструмента (меню)/библиотеки, связывающего эту розетку с "InitialkramerImage" от владельца файлов " MyFirstIphoneAppViewController.xib". Затем вы сохранили проект. Но после этого вы можете изменить имя выходной переменной "InitialkramerImage" на "kramerImage". Итак, после этого

@interface MyFirstIphoneAppViewController : UIViewController<> {
    UIImageView *kramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage;

и сохранение проекта при его запуске, нет никакого существования выхода "InitialkramerImage" в " MyFirstIphoneAppViewController.xib". Таким образом, при запуске проекта не будет никакой ссылки на выход из Imageview на "kramerImage" и

" для отображения вида, UIViewController попытается найти выход к "InitialkramerImage", который не существует."

Так, оно бросит "NSUnknownKeyException".

Вы можете проверить отсутствует розетка открытие пера (.файл xib), затем вправо нажав на "владельца файлов" этого.


Если вы сделали этот код где-то еще и имели zip/сжатый файл, попробуйте извлечь его снова. Он может работать я не знаю, почему, но я чувствую, что это добыча.

или вы можете попытаться изменить IBOutlet на kramerImage и связать его снова в NIB.