Я пишу свое первое приложение для 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 или почему класс не соответствует кодированию значения ключа для ключа.





(На самом деле это не относится к iPhone - то же самое произойдет в обычном Какао).
NSUnknownKeyException - это распространенная ошибка при использовании Кодирование ключевого значения для доступа к ключу, которого у объекта нет.
К свойствам большинства объектов Какао можно получить доступ напрямую:
[@"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', и попытайтесь отследить его оттуда.
Спасибо за это - наконец-то исправлено еще одно потраченное впустую 3 часа. :)
У меня возникла эта проблема в ситуации, когда я копировал файлы из одного проекта в другой. Мой xib ссылался на неправильное имя класса. Этот ответ дал мне достаточно информации для момента эврики, так что спасибо.
Спасибо за хорошее объяснение. Это мне не очень помогает, так как я все еще в замешательстве .. Я просто загружаю пакет для TableCellView, но все рухнуло даже раньше, чем что-либо: pastebin.com/QuR29q6B
Также при переименовании представления не забудьте удалить ссылку на владельца файла. Это также может вызвать эту ошибку.
+1 это случилось со мной. Я переименовал переменную для своего MKMapView и внезапно БАМ! NSUknownUknownKeyException.
На раскадровке была кнопка, не связанная ни с чем, что вызывало ошибку KeyValue. Это решило мою проблему. Спасибо!
Вот тот, где вы получите эту ошибку - и как ее исправить. Я получал это при загрузке пера, в котором только что был настраиваемый TableViewCell. Я использовал IB для создания xib, в котором были только владелец файла, первый ответчик и TableViewCell. В TableViewCell было всего 4 UILabels, которые соответствовали классу с 4 IBOutlet UILabels, называемому rootCell. Я изменил класс TableViewCell на rootCell. Он работал нормально, пока не внес пару изменений, и внезапно я получил setValue: forUndefinedKey: когда я просто создавал экземпляр класса после загрузки его из пера:
NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"rootCell-iPad" owner:self options:nil];
cell = [nib objectAtIndex:0];
Ошибка в первой строке, когда перо пыталось загрузить. Через некоторое время я заметил, что он пытается сопоставить метки IBOutlet с корневым контроллером, а НЕ с классом rootCell! Это была моя наводка. Что я сделал неправильно, так это непреднамеренно сменил владельца файла на класс rootCell. Когда я снова изменил его на NSObject, он не пытался соответствовать делегату (rootController) при загрузке. Итак, если вы делаете это, сделайте File's Owner NSObject, но сделайте UITableCell вашим желаемым классом.
+1 И обратите внимание на себя и всех, кто всегда забывает об этом: при использовании loadNibNamed: owner: options: владельцем файла должен быть NSObject, основным представлением должен быть тип вашего класса, и все выходы должны быть подключены к представлению, нет Владелец файла.
Спасибо, Оуэн, я боролся с точно такой же ситуацией. Решено, как описано. Большое спасибо!
Кажется, ты делаешь
@interface MyFirstIphoneAppViewController : UIViewController<> {
UIImageView *InitialkramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage;
Затем после синтеза этого изображения, когда вы открываете «MyFirstIphoneAppViewController.xib» в Interface Builder, вы берете представление изображения из инструмента (меню) / библиотеки, связывая этот выход с «InitialkramerImage» от владельца файлов «MyFirstIphoneAppViewController.xib» . Потом вы сохранили проект. Но после этого вы можете изменить имя выходной переменной «InitialkramerImage» на «kramerImage». Итак, после этого
@interface MyFirstIphoneAppViewController : UIViewController<> {
UIImageView *kramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage;
и сохранение проекта при его запуске. В «MyFirstIphoneAppViewController.xib» отсутствует выход «InitialkramerImage». Итак, когда вы запустите проект, не будет ссылок на выход из Imageview на 'kramerImage' и
"For displaying the view, UIViewController will try to find the outlet to "InitialkramerImage" which is not existing."
Итак, он выбросит исключение NSUnknownKeyException.
You can check the missing outlet by opening the nib(.xib) file then right clicking on the 'Files Owner' of that.
Сегодня у меня была такая же проблема. У меня не было указанного класса для контроллера просмотра в моем контроллере навигации. Это будет часто случаться, если вы не укажете правильный класс для ваших представлений в Интерфейсном Разработчике.
Вы также получите проблемы с недопустимым селектором. Всегда проверяйте свои классы и соединения Interface Builder!
Спасибо. У меня был правильно указан класс в IB, но было несоответствие между моим контроллером и пером, указанным в initWithNibName: - Мне следовало отозвать свои права копирования + вставки.
Просто вернитесь в додзё iOS и попрактикуйтесь в копи + вставке-фу.
Если вы выполнили этот код где-то еще и у вас есть zip / сжатый файл, попробуйте извлечь его снова. Это может сработать, я не знаю почему, но мне кажется, что это проблема с извлечением.
или вы можете попробовать изменить IBOutlet на kramerImage и снова привязать его к NIB.
У меня была такая ситуация, и оказалось, что даже после нахождения всех экземпляров переменной и их удаления мое приложение все равно вылетало. Вот что случилось ... Я создал еще один экземпляр переменной из текстового поля из моего XIB в моем viewController.h, но понял, что он мне больше не нужен, и удалил его. Оказывается, моя программа видела это и продолжала пытаться использовать это в программе, поэтому в будущем, если это произойдет где-нибудь еще, просто войдите в XIB, щелкните правой кнопкой мыши кнопку или текстовое поле и т.д. и удалите все лишние неиспользуемые переменные.
Вот как я решил свое: в построителе интерфейсов щелкните правой кнопкой мыши контроллер представления, на отсутствующем выходе или методе действия должен быть восклицательный знак. Найдите и удалите все ссылки, и это решило ее.
Это произошло из-за того, что я удалил метод действия в файле .m.
Я получаю эту ошибку, и это как-то связано с конструктором интерфейсов, но я не могу понять, как ее исправить.