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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
19
0
28 762
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

(На самом деле это не относится к 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', и попытайтесь отследить его оттуда.

Я получаю эту ошибку, и это как-то связано с конструктором интерфейсов, но я не могу понять, как ее исправить.

bentford 25.09.2008 03:58

Спасибо за это - наконец-то исправлено еще одно потраченное впустую 3 часа. :)

Toby Allen 03.08.2010 20:40

У меня возникла эта проблема в ситуации, когда я копировал файлы из одного проекта в другой. Мой xib ссылался на неправильное имя класса. Этот ответ дал мне достаточно информации для момента эврики, так что спасибо.

Grumdrig 25.08.2010 01:37

Спасибо за хорошее объяснение. Это мне не очень помогает, так как я все еще в замешательстве .. Я просто загружаю пакет для TableCellView, но все рухнуло даже раньше, чем что-либо: pastebin.com/QuR29q6B

Zennichimaro 26.03.2013 12:04

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

+1 это случилось со мной. Я переименовал переменную для своего MKMapView и внезапно БАМ! NSUknownUknownKeyException.

ladookie 18.03.2011 06:10

На раскадровке была кнопка, не связанная ни с чем, что вызывало ошибку KeyValue. Это решило мою проблему. Спасибо!

Michael Ozeryansky 19.07.2012 15:55

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

Echelon 31.05.2011 23:52

Спасибо, Оуэн, я боролся с точно такой же ситуацией. Решено, как описано. Большое спасибо!

Khiet 11.04.2012 02:25

Кажется, ты делаешь

@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: - Мне следовало отозвать свои права копирования + вставки.

masty 28.09.2012 08:32

Просто вернитесь в додзё iOS и попрактикуйтесь в копи + вставке-фу.

gonzobrains 29.09.2012 09:16

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

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

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

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

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

Другие вопросы по теме