Xcode - Как исправить "NSUnknownKeyException", причина:… этот класс не соответствует значению ключа, кодирующему ошибку "X"?

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

Мое приложение падает со следующей ошибкой.

Что это значит?

Как я могу это исправить?

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

Ответ 1

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

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

Вы получаете ошибку

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

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

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

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

Еще одна возможная причина этой ошибки:

Bad Outlet.

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

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

Ответ 2

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

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

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

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

    example 1

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

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

    example 2

Ответ 3

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

Ответ 4

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

Ответ 5

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

enter image description here

Ответ 6

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

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

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

Ответ 7

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

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

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

enter image description here

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

Ответ 8

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

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

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

enter image description here

Ответ 9

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

  • сначала откройте свою историю в качестве исходного кода.
  • поиск <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-раскладки раскадровки;)

Ответ 10

enter image description hereenter image description here

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

Ответ 11

  • Вам нужно только указать IBOutlet один раз, метку IBOutlet ваш ivar не нужен.
  • Вы создаете экземпляр своего NIB с помощью UIViewController? В какой-то момент вы должны позвонить [SecondView initWithNibName:@"yourNibName" bundle:nil];

Ответ 12

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

Ответ 13

У меня было то же сообщение об ошибке и спасибо (!!) Кире от 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];

Ответ 14

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

Ответ 15

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

если ты

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

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

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

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

enter image description here

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

Ответ 16

Это происходит со мной, когда мой контроллер представления первоначально имел .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];
}

Ответ 17

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

Ответ 18

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

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

Ответ 19

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

Я работал над кодированием веб-службы в 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, которые соединены между собой

Ответ 20

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

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

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

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

Ответ 21

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

Ответ 22

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

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

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

Ответ 23

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

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

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

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

Ответ 24

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

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

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

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

Ответ 25

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

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

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

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

Ответ 26

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

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

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

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

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

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

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

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

Ответ 27

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

Shift + Command + K

решил мою проблему. Я очистил проект и перестроил его.

Ответ 28

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

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

Ответ 29

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

Ответ 30

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