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

StackOverflow https://stackoverflow.com/questions/46220

  •  09-06-2019
  •  | 
  •  

Вопрос

Я пишу свое первое приложение для 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 — то же самое произойдет и с обычным Cocoa).

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 UILabel, которые соответствовали классу с 4 UILabels IBOutlet, называемому 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 желаемым классом.

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

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

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

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

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

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

@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;

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

«Чтобы отобразить представление, UiviewController попытается найти выход для« initialKramerimage », которого нет».

Итак, он выдаст «NSUnknownKeyException».

Вы можете проверить отсутствующую розетку, открыв файл NIB (.xib), затем щелкнув правой кнопкой мыши на «владелец файлов».

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top