Приложение 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 или почему класс не соответствует ключевому значению для ключа.
Ответы
Ответ 1
(Это не совсем конкретный iPhone - то же самое произойдет в обычном Cocoa).
NSUnknownKeyException является распространенной ошибкой при использовании Key-Value Coding для доступа к ключу, который не имеет объекта.
К свойствам большинства объектов 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 не имеет свойства (key), называемого "purpleMonkeyDishwasher".
Что-то в вашем коде пытается установить значение для ключа "kramerImage" на UIView, которое (по-видимому) не поддерживает этот ключ. Если вы используете Interface Builder, это может быть что-то в вашем nib.
Найдите, где используется "kramerImage", и попытайтесь отследить его там.
Ответ 2
Также, когда вы переименовываете представление, не забудьте удалить ссылку на File Owner. Это может также вызвать эту ошибку.
Ответ 3
Здесь, где вы получите эту ошибку - и как ее исправить. Я получал его при загрузке наконечника, который имел только собственный TableViewCell. Я использовал IB для создания xib, который имел только File Owner, First Responder и TableViewCell. В TableViewCell было всего 4 UILabels, которые соответствовали классу с 4 IBUutlet 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 Owner NSObject, но сделайте UITableCell вашим желаемым классом.
Ответ 4
У меня была такая же проблема сегодня. У меня не было подходящего класса, указанного для контроллера просмотра в моем навигационном контроллере. Это часто случается, если вы не укажете правильный класс для своих представлений в Interface Builder.
Вы также получите недопустимые проблемы с селектором. Всегда проверяйте классы и соединения Interface Builder!
Ответ 5
У меня была такая ситуация, и получается, что даже после обнаружения всех экземпляров переменной и удаления их мое приложение все еще разбилось. Вот что случилось... Я создал другой экземпляр переменной из текстового поля из моего XIB в мой viewController.h, но я понял, что мне больше не нужен, и удалил его. Оказывается, моя программа увидела это и продолжала пытаться использовать его в программе, поэтому в будущем, если это произойдет в другом месте, просто войдите в XIB, щелкните правой кнопкой мыши на кнопке или текстовом поле и удалите все лишние неиспользуемые переменные.
Ответ 6
Вот как я решил мой, в Interface builder щелкните правой кнопкой мыши View Viewer, должен быть восклицательный знак на отсутствующем выходе или методе действия. Найдите и удалите все ссылки и решите их.
Это произошло потому, что я удалил метод действия в файле .m.
Ответ 7
Кажется, вы делаете
@interface MyFirstIphoneAppViewController : UIViewController<> {
UIImageView *InitialkramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage;
Затем, после синтеза этого изображения, когда вы открываете "MyFirstIphoneAppViewController.xib" в Interface Builder, вы берете изображение из инструмента (меню)/библиотеку den, связывающего эту выходную строку с "InitialkramerImage" от владельца файлов "MyFirstIphoneAppViewController".xib". Затем вы сохранили проект. Но после этого вы можете изменить имя выходной переменной "InitialkramerImage" на "kramerImage". Итак, после этого
@interface MyFirstIphoneAppViewController : UIViewController<> {
UIImageView *kramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage;
и сохранение проекта при его запуске. В "MyFirstIphoneAppViewController.xib" нет выхода из "InitialkramerImage". Таким образом, при запуске проекта не будет ссылки на выход из Imageview в "kramerImage" и
"Для отображения вида, UIViewController попытается найти выход в "InitialkramerImage", который не существует. "
Итак, он выкинет "NSUnknownKeyException".
Вы можете проверить отсутствие открыв файл nib (.xib), затем вправо нажав на "Владелец файлов".
Ответ 8
Если вы сделали этот код где-то в другом месте и имели файл zip/compression, попробуйте извлечь его снова. Это может работать, я не знаю, почему, но я чувствую, что это проблема извлечения.
или вы можете попробовать изменить IBOutlet на kramerImage и связать его снова в NIB.