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

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

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

*** Завершение приложения из-за неперехваченного исключения "NSUnknownKeyException", причина: "[< UIViewController 0x6e36ae0 > setValue: forUndefinedKey:]: этот класс не соответствует требованиям к ключевым словам для ключа XXX. '

863
задан Guillaume Dubois 21 июня '10 в 22:57
источник поделиться
63 ответов
  • 1
  • 2
  • 3

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

Я загрузил ваш проект.

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

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

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

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

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

717
ответ дан TechZen 21 июня '10 в 23:29
источник поделиться

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

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

Из вашего наконечника:

  • Выберите объект в IB и перейдите к "Инспектору подключений".
  • В разделе "Реферирование выходных данных" убедитесь, что ваш объект еще не подключен к имени старого свойства... если он есть, щелкните маленький "x", чтобы удалить ссылку и строить снова.

    example 1

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

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

    example 2

1280
ответ дан nuttysimple 11 нояб. '11 в 2:14
источник поделиться

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

98
ответ дан Steve Rogers 09 янв. '12 в 8:32
источник поделиться

У меня была эта ошибка, когда я пытался реализовать пользовательский ViewCell для таблицы. Когда я выделил контроллер View для 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

76
ответ дан Gerard Grundy 22 нояб. '13 в 0:58
источник поделиться

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

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

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

58
ответ дан erkanyildiz 30 июня '12 в 16:00
источник поделиться

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

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

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

enter image description here

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

53
ответ дан Tibidabo 29 марта '13 в 5:32
источник поделиться

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

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

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

enter image description here

39
ответ дан Eric Brotto 28 сент. '11 в 14:37
источник поделиться

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

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

Например:

<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-раскладки раскадровки;)

30
ответ дан fareed namrouti 23 июля '14 в 1:11
источник поделиться

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

27
ответ дан Maj 14 окт. '13 в 3:00
источник поделиться
  • Вам нужно только указать IBOutlet один раз, метку IBOutlet ваш ivar не нужен.
  • Вы создаете экземпляр своего NIB с помощью UIViewController? В какой-то момент вы должны позвонить [SecondView initWithNibName:@"yourNibName" bundle:nil];
25
ответ дан kubi 21 июня '10 в 23:07
источник поделиться

enter image description hereenter image description here

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

23
ответ дан ashack 06 марта '14 в 22:57
источник поделиться

У меня было то же сообщение об ошибке и спасибо (!!) Кире от 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];
20
ответ дан Yannis 01 сент. '13 в 0:40
источник поделиться

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

18
ответ дан mrabins 05 апр. '17 в 21:51
источник поделиться

Это происходит со мной, когда мой контроллер представления первоначально имел .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];
}
14
ответ дан neoneye 27 июня '13 в 22:06
источник поделиться

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

Если вы

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

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

Не удалось установить (xxx) пользовательское проверенное свойство в [Свой пользовательский View]...: этот класс не является ключевым значением, совместимым с кодировкой для ключа [XXX].

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

введите описание изображения здесь

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

10
ответ дан Suragch 22 авг. '15 в 11:06
источник поделиться

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

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

9
ответ дан David Carney 06 янв. '11 в 7:36
источник поделиться

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

7
ответ дан MehrozKarim 11 июля '12 в 13:34
источник поделиться

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

7
ответ дан ercu 20 сент. '15 в 19:24
источник поделиться

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

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

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

7
ответ дан kubilay 23 окт. '12 в 12:06
источник поделиться

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

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

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

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

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

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

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

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

типы классов, полученные из NSObject

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

Строки Swift, которые соединены между собой

6
ответ дан AtheistP3ace 26 янв. '16 в 18:24
источник поделиться

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

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

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

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

6
ответ дан Jason 21 авг. '10 в 17:04
источник поделиться

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

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

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

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

6
ответ дан Emy Stats 08 апр. '16 в 15:45
источник поделиться

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

5
ответ дан Ilansky Naftali 12 авг. '17 в 15:08
источник поделиться

Эта ошибка - это что-то еще!

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

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

Приветствия,

5
ответ дан Ronaldoh1 22 февр. '15 в 9:43
источник поделиться

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

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

  • Выделите ваш .m файл.
  • На правой панели выберите "Инспектор файлов".
  • В разделе "Целевое членство" убедитесь, что установлен соответствующий целевой объект сборки.

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

5
ответ дан Mike M. Lin 25 сент. '14 в 0:11
источник поделиться

У меня была такая же проблема. Я создал tableviewCell в XIB файле и получал такую ​​ошибку. Моя проблема заключалась в том, что я определил класс "Владелец файла" как мой контроллер ячеек. Я просто взял его и установил класс ячейки (в файле xib щелкните по границе ячейки, перейдите на третью вкладку на правой панели и где он говорит, что класс выбрал ваш контроллер представления).

Также попробуйте очистить свой код.

3
ответ дан pedrotorres 10 сент. '12 в 12:38
источник поделиться

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

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

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

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

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

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

.6 Подключите ваши розетки.

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

3
ответ дан Damo 07 июля '16 в 16:38
источник поделиться

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

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
3
ответ дан wspruijt 14 мая '14 в 16:39
источник поделиться

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

3
ответ дан priya 01 февр. '12 в 13:32
источник поделиться

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

3
ответ дан Symmetric 28 окт. '11 в 6:10
источник поделиться
  • 1
  • 2
  • 3

Другие вопросы по меткам