Что это значит? "'NSUnknownKeyException', причина: ... этот класс не соответствует кодированию ключевых значений для ключа X"

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

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

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

30 ответов


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

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

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

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

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

кстати, это плохая практика иметь имена, такие как" string " в Objective-C. Он приглашает столкновение именования во время выполнения. Избегайте их даже в once off практике приложений. Именования столкновений может быть очень трудно отследить, и вы не хотите тратить время.

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


У вас может быть плохое соединение в вашем xib.

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

от вашего пера:

  1. Выберите объект в IB и перейдите в раздел "инспектор соединений".
  2. Под 'Привязки Розеток' убедитесь, что объект не подключен к старому имени свойства... если это так, нажмите маленький "x", чтобы удалить ссылку и снова строить.

    example 1

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

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

    example 2


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


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

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

просто убедитесь, что у вас есть только соединения с ячейкой представления таблицы. Для проверки нажмите на вид таблицы сотовый и инспектор ищут ваши связи.

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


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

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

Если вы укажете xib, он аварийно завершит работу.


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

Control-нажмите на файлы в Построителе интерфейса, если вы видите восклицательным знаком вы должны исправить это.

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

enter image description here

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


иногда это связано с "наследовать от цели", что значение должно быть установлено. С помощью одиночных целевых приложений вы можете просто выбрать наследовать от цели. Если у вас несколько целей, выберите нужную цель. enter image description here


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

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

надеюсь, что это помогает.

enter image description here


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

  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-тегами раскадровки раскадровки;)


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


  1. вам нужно только указать IBOutlet раз IBOutlet ярлык вашего ivar не нужен.
  2. ты инстанцирования ваш НИБ используя UIViewController? В какой-то момент Вы должны позвонить [SecondView initWithNibName:@"yourNibName" bundle:nil];

enter image description hereenter image description here

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


у меня было точно такое же сообщение об ошибке и спасибо (!!) Кире от 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 (?!?) часы прямо сейчас для ответа на это сообщение об ошибке. Если я могу сделать это для 1 или 2 человек это было бы здорово :)

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

    [self presentViewController:deviceViewController animated:YES completion:nil];

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


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

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

пытается загрузить .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];
}

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

Если вы

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

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

не удалось установить (xxx) пользовательское свойство inspected на [ваш пользовательский Вид. ]..: этот класс не значение ключа кодирования-совместимый для ключа [xxx].

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

enter image description here

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


свойство"Module" контроллера вида в Инспекторе удостоверений может отличаться от ожидаемого. Также убедитесь, что в целевой список добавлены новые классы.


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

т. е. cmd-нажмите на рассматриваемый класс UIViewController и дважды проверьте, что он включен в "цели" табуляция.


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


У меня просто была эта проблема в моем дублированном проекте и решена путем проверки 2 мест:

1 - Убедитесь, что у вас есть .M файл в списке - > Project-Build Phases-Compile Sources
2-После этого перейдите в interface builder (возможно, это ошибка происходит только с IB) и отсоедините все свойства, метки, изображения и т. д... Затем снова свяжите все. Я понял, что удалил атрибут, но он все еще был связан В IB.

надеюсь, что это работает для некоторых.


еще одна" несовместимая " проблема, которую я нашел, была, когда мне по какой-то причине удалось иметь две копии класса.

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

чтобы найти" правильную " копию, я использовал cmd XCode-нажмите на имя класса в другом месте, чтобы перейти к правильной копии, затем я убил плохие неиспользуемые копии (после приведения моих правок из неиспользуемой копии).

мораль истории: дубликаты файлов классов плохие.


эта ошибка-это что-то другое!

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

  1. проверил, что кнопка была подключена к правильному действию.(Это не было проблемой, но все равно хорошо проверить)
  2. убедитесь, что на кнопке нет дополнительных действий или точек, которые вы могли создать по ошибке. (Этот не было проблемы, но все равно хорошо проверить)
  3. Проверьте журналы и убедитесь, что все кнопки на следующем экране имеют правильные действия, и если есть какие-либо сегменты, убедитесь, что они имеют уникальный идентификатор. (Это было проблемой)
    • один из сегментов не имел уникального идентификатора
    • одна из кнопок имела действие и два выхода, которые я создал по ошибке.
    • удалите все дополнительные розетки и убедитесь, что вы сегментируете следующий экран имеет уникальные идентификаторы.

спасибо,


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

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

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

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

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

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

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

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

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

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

быстрые структуры, которые соединены


" этот класс не соответствует кодированию ключевого значения для ключа" Я знаю, что это немного поздно, но мой ответ отличается, поэтому я думаю, что его нужно опубликовать, я нажимал второй контроллер неправильно, вот образец

неправильный способ нажать контроллер

UIViewController* controller = [[UIViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

правильно

TempViewController* controller = [[TempViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Я не нашел ответа, как указано выше, поэтому, возможно, это может помочь кому-то с той же проблемой


У меня был тот же симптом. Основной причиной было то, что" целевое членство " для моего исходного файла не было установлено на правильную цель. Я предполагаю, что это означает, что мой класс не будет построен и включен в мое приложение.

чтобы исправить это:

  1. подчеркнуть вашу .m-файл.
  2. в правой панели, выберите Файл инспектор.
  3. в разделе "целевое членство" убедитесь, что выбрана соответствующая цель сборки.

надеюсь, что это помогает кому-то там.


в моем случае. У меня не было отсутствующих выходов в xib-файлах после слияния.

Shift + Command + K

решить мою проблему. Я очистил свой проект и восстановил его.


Если у вас есть пользовательский подкласс UIViewController с IBOutlets, которые вызывают проблемы, единственным набором шагов, которые я нашел, чтобы фактически избавиться от ошибки, были

.1 измените класс на UIViewController

.2 Отключите все розетки (теперь все они будут иметь желтый предупреждающий треугольник) - может быть достаточно просто отключить проблемные розетки.

.3 Выполните все стандартные шаги - ↑ ⌘ k, удалите производные данные (, молитвенные коврики, беспокойство бисер)

.4 запустите приложение-перейдите на проблемную сцену.

.5 убейте приложение, вернитесь к Interface Builder измените класс обратно на имя пользовательского класса.

.6 подключите розетки.

запустите приложение , и это, как правило, прояснило проблемы соответствия ключевым значениям.


в моем случае это было вызвано ссылкой на неправильный перо:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];

Я получал эту ошибку с раскадровками. Вышеприведенное решение, похоже, не было проблемой, поэтому я в конечном итоге удалил контроллер представления и добавил его снова (и, конечно, повторно подключил сегмент и переназначил класс), который исправил его. Я не знаю, что это было на самом деле, но я переименовал связанный класс контроллера вида незадолго до того, как это началось, так что, возможно, это было что-то.


У меня такая же проблема. Я сбросил симулятор. Удаление и добавление кнопки управления. и, наконец, сделал чистым. :) Благодаря переполнению стека. Некоторые, как мой код стал ОК и начал работать.