Что это значит? «NSUnknownKeyException, причина:… этот класс не соответствует значению ключа, кодирующему ключ X» - PullRequest
1109 голосов
/ 21 июня 2010

Я пытаюсь связать UILabel с IBOutlet, созданным в моем классе.

У меня сбой приложения со следующей ошибкой. Что это значит? Как я могу это исправить?

*** Завершение работы приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[ setValue: forUndefinedKey:]: этот класс не соответствует значению ключа, кодирующему ключ XXX. '

Ответы [ 66 ]

30 голосов
/ 14 октября 2013

Это происходило со мной только при отладке на устройстве (iPhone).Симулятор iOS работал нормально.Выполнение «Product-> Clean» из Xcode, похоже, решило проблему, но я не знаю почему.

30 голосов
/ 22 июня 2010
  1. Вам нужно указать IBOutlet только один раз, метка IBOutlet для вашего ивара не нужна.
  2. Вы создаете экземпляр своего NIB, используя UIViewController? В какой-то момент вы должны звонить [SecondView initWithNibName:@"yourNibName" bundle:nil];
23 голосов
/ 12 августа 2017

Это может происходить из-за того, что вы перетаскивали элемент управления и создали розетку или действие и забыли удалить его. Даже если вы удалили код или даже сделали достаточно cmd + Z, вам нужно зайти в инспектор соединений на вашей раскадровке и посмотреть, все ли созданное вами действие или выход все еще здесь или нет.

22 голосов
/ 01 сентября 2013

У меня было точно такое же сообщение об ошибке, и спасибо (!!) Кире от http://www.idev101.com Я смог решить проблему. Я нашел ее сайт только после того, как погуглил и сложил все эти темы. Сейчас я публикую здесь следующую статью, которая относится к StackOverFlow и имеет ту же проблему, с которой я столкнулся, поскольку этот человек, скорее всего, перейдет в эту ветку через Google.

Я понял, что ошибочно сделал это:

UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Вместо ЭТОГО:

DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Где

DeviceViewController

Было ли имя моего класса также известен как

DeviceViewController.h 
DeviceViewController.m

Вам придется

"import DeviceViewController.h"

в вашей реализации (.m файл), куда вы хотите позвонить, например. другой UIViewController.

Я абсолютно не сожалею, если я только излагаю очевидное для начинающих, таких как я, и могу получить голоса, поскольку это не совсем связано с вопросом, но я искал 4 (?!?) Часа прямо сейчас, чтобы найти ответ на вопрос. эти сообщения об ошибках. Если бы я мог сэкономить это одному или двум людям, это было бы здорово :) 1022 *

PS: Для тех, кто интересуется продолжением кода для загрузки другого UIViewController:

    [self presentViewController:deviceViewController animated:YES completion:nil];
20 голосов
/ 22 августа 2015

Просматривая другие ответы, кажется, что есть много вещей, которые могут вызвать эту ошибку. Вот еще один.

Если вы

  • есть пользовательский вид
  • добавлено свойство @IBInspectable
  • , а затем удалил его

Тогда вы также можете получить ошибку, похожую на

Не удалось установить (xxx) проверенное пользователем определенное свойство в [Your Custom View] ...: этот класс не соответствует значению ключа для ключа [Ххх].

Решение состоит в том, чтобы удалить старое свойство.

enter image description here

Откройте инспектор удостоверений для вашего класса, выберите имя свойства в разделе «Определенные пользователем атрибуты времени выполнения» и нажмите кнопку «минус» (-).

15 голосов
/ 27 июня 2013

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

Даже если я удалил файл .xib из этого проекта.Пользователи iPhone / iPad могут содержать файлы .xib для этого контроллера представления.

Попытка загрузки файла .xib обычно приводит к этой ошибке:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.'

Решением при его программном создании может быть:

-(void)loadView {
    // Ensure that we don't load an .xib file for this viewcontroller
    self.view = [UIView new];
}
12 голосов
/ 20 сентября 2015

Свойство «Модуль» View Controller в Identity Inspector может отличаться от ожидаемого.Также убедитесь, что новые классы добавлены в ваш целевой список.

10 голосов
/ 06 января 2011

У меня была похожая проблема для проекта, который имеет две цели (со своим собственным MainWindow XIB).Основная проблема, которая вызвала у меня эту ошибку, заключалась в том, что класс UIViewController не был включен в список ресурсов второго проекта.Т.е. конструктор интерфейса позволил мне указать его в MainWindow.xib, но во время выполнения система не смогла найти класс.

Т.е. cmd-клик по рассматриваемому классу UIViewController и перепроверить, что он включен вВкладка «Цели».

8 голосов
/ 26 января 2016

Просто чтобы добавить к этому, потому что я тоже получал эту ошибку.Прохождение всех этих ответов, кажется, наиболее применимо к работе с пользовательским интерфейсом и раскадровкой.Я знаю, что оригинальный постер действительно работал с пользовательским интерфейсом, но при поиске возможных причин этой ошибки, в основном, все вопросы возвращаются к этому вопросу, когда другие закрываются как дубликаты или просто возникают проблемы с подключением объектов в раскадровке, поэтому я будудобавьте мое решение.

Я работал над кодированием веб-службы в Swift 2. Я создал все необходимые прокси-объекты и заглушки.Проходя по возвращенному XML, я динамически создавал экземпляры своих объектов, которые все пришли из NSObject и с использованием setValue:forKey.Каждый раз, когда setValue:forKey пытался установить свойство, оно взрывалось с этой ошибкой.

У меня был оператор switch для каждого типа, с которым я имел дело (например, Bool?, CShort?, String?) идля каждого узла XML я прошел и проверил тип объекта, а затем преобразовал значение в этот тип и попытался установить его с помощью setValue:forKey.

В конце концов я начал комментировать все эти setValue:forKeyя обнаружил, что мой default регистр оператора switch работает для String?.

. Наконец-то я понял, что вы не можете использовать дополнительные типы swift с setValue:forKey, если они не имеютпрямое сопоставление с типом Objective-C, например String? или NSNumber?.Я закончил тем, что изменил все типы CShort? на NSNumber?, так как это имеет прямое отображение.Для Bool? в моем случае было нормально использовать Bool и инициализировать его false.У других, возможно, нет такой роскоши.

В любом случае, какая головная боль, которая была так надеялась, помогает кому-то, у кого есть подобная проблема, и продолжает перенаправляться на этот вопрос и говорить себе: «Я ничего не делаю в пользовательском интерфейсе!! ".

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

Вы не можете использовать KVC на дополнительномСвойство Int, поскольку KVC - это Какао / Objective-C, а Objective-C не может видеть необязательный Int - он не соединен с Objective-C.Objective-C может видеть только типы, которые связаны с Objective-C:

типы классов, производные от классов классов NSObject

, которые предоставляются с помощью @ objc

Swift структурыкоторые соединены

8 голосов
/ 11 июля 2012

Это может быть в случае ссылки на компонент из интерфейса Xib, который вы переименовали или удалили.Повторная ссылка работает для меня.

...