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.