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

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

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

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

Ответы [ 66 ]

1482 голосов
/ 11 ноября 2011

Возможно, у вас плохое соединение в xib.

Я неоднократно сталкивался с этой ошибкой.Хотя ответ TechZen в этом случае абсолютно верен, другой распространенной причиной является то, что вы меняете имя свойства IBOutlet в своем .h / .m, которое вы уже подключили к владельцу файла в nib.

Из своего пера:

  1. Выберите объект в IB и перейдите в «Инспектор соединений».
  2. В разделе «Ссылки на выходы» убедитесь, чтоваш объект все еще не связан со старым именем свойства ... если это так, щелкните маленькую букву 'x', чтобы удалить ссылку и построить заново.

    example 1

Другая распространенная причина, если вы используете раскадровку, ваша UIButton может иметь более одного назначения (решение почти такое же, как для пера):

  1. Откройте раскадровку и щелкните правой кнопкой мыши кнопку UIB
  2. . Вы увидите, что этой кнопке назначено несколько ссылок / ссылок.Удалите одно из серых окон "Main ..." с маленькой буквой "x":

    example 2

917 голосов
/ 22 июня 2010

Возможно, в вашем контроллере вида указан неправильный класс.

Я скачал ваш проект.

Ошибка, которую вы получаете:

'NSUnknownKeyException', причина: '[ setValue: forUndefinedKey:]: этот класс не совместим со значением ключа для кодировки строки ключа.'

Это вызвано тем, что контроллер вида Second в MainWindow.xib имеет класс UIViewController вместо SecondView. Переход на правильный класс решает проблему.

Кстати, это плохая практика - иметь такие имена, как «строка» в Objective-C. Это вызывает столкновение именования во время выполнения. Избегайте их даже в разовых тренировочных приложениях. Названия коллизий могут быть очень трудно отследить, и вы не хотите тратить время.

Другая возможная причина этой ошибки: при копировании и вставке элементов из одного контроллера в другой, Xcode каким-то образом сохраняет эту ссылку на исходный контроллер, даже после редактирования и повторной привязки этого элемента в новый контроллер.

Другая возможная причина этой ошибки:

Bad Outlet.

У вас удалено или переименовано имя розетки в файле .h.

Удалите его в инспекторе соединений файла .xib или .storyboard.

110 голосов
/ 09 января 2012

Мне пришлось удалить приложение с симулятора / iPhone, чтобы избавиться от этой ошибки.

100 голосов
/ 22 ноября 2013

У меня была эта ошибка, когда я пытался реализовать пользовательский ViewCell для таблицы. Когда я выделил View controller для XIB и подключился к элементам в CellView, возникла ошибка «этот класс не соответствует значению ключа для кода», как только я удалил их, он избавился от ошибки.

Удалите соединения на изображении ниже. Delete the connections in inspector when File Owner is highlighted

Просто убедитесь, что у вас есть только соединения с ячейкой табличного представления. Для проверки нажмите на ячейку табличного представления и в INSPECTOR найдите ваши соединения.

The connection should be in here when Table View Cell is highlighted

82 голосов
/ 05 апреля 2017

Иногда это связано с вашим «Наследовать от цели». Это значение должно быть установлено. В приложениях с одной целью вы можете просто выбрать Inherit From Target. Если у вас более одной цели, выберите нужную цель.

enter image description here

64 голосов
/ 30 июня 2012

Если это приложение только для iPhone, а не универсальное, убедитесь, что следующее поле не заполнено:

Цели> Сводка> Информация о развертывании iPhone / iPod> Главный интерфейс

Если выукажите xib там, где он падает.

60 голосов
/ 29 марта 2013

Эта ошибка означает, что уже подключенный объект Interface Builder удален / переименован в в источнике его владельца (Владелец файла).

Удерживая клавишу Control, щелкните на Владельце файлов в Интерфейсном Разработчике, если вы видите восклицательный знак , который необходимо исправить.

На рисунке ниже вы можете видеть, что «aRemovedView» имеет восклицательный знак справа, потому что я удалил объект представления IBOutlet, когда он уже был подключен в IB.

enter image description here

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

41 голосов
/ 28 сентября 2011

У меня была такая же проблема, и, хотя ответ TechZen действительно может быть удивительным, мне было трудно применить к моей ситуации.

В конце концов я решил проблему, связав метку через контроллер, указанный в Объекты (выделено на рисунке ниже), а не через Владелец файла .

Надеюсь, это поможет.

enter image description here

36 голосов
/ 23 июля 2014

в моем случае это была ошибка в исходном коде раскадровки, выполните следующие действия:

  1. сначала откройте свою раскадровку как исходный код
  2. поиск <connections>
  3. удалить нежелательные соединения

Например:

<connections>
    <outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/>
    <outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/>
    <outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/>
</connections>

Как видите, это связи между именами переменных вашего кода и тегами XML раскадровки;)

32 голосов
/ 06 марта 2014

enter image description here enter image description here

Мое исправление было похоже на исправление Джерарда Гранди.При создании пользовательского UITableViewCell с использованием XIB я по ошибке применил имя пользовательского класса к владельцу файла, а не к UITableViewCell.Применение класса к UITableViewCell на холсте и подключение к нему моих свойств IBOutlet решило проблему.

...