Подтвердить что ты не робот

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

4b9b3361

Ответ 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.