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", чтобы удалить ссылку и строить снова.
Еще одна распространенная причина, если вы используете Storyboard, ваш UIButton может иметь более одного присваивания (решение почти такое же, как для nib):
Ответ 3
Мне пришлось удалить приложение из симулятора /iPhone, чтобы избавиться от этой ошибки.
Ответ 4
У меня была эта ошибка, когда я пытался реализовать пользовательский ViewCell для таблицы. Когда я выделил контроллер View для XIB и подключился к элементам CellView, возникла ошибка "этот класс не является ключевым значением, совместимым с кодировкой для ключа", как только я удалю их, он избавился от ошибки.
Удалите соединения в следующем изображении.
Просто убедитесь, что у вас есть только соединения с ячейкой просмотра таблицы. Чтобы проверить щелчок на ячейке просмотра таблицы, а в INSPECTOR найдите свои соединения.
Ответ 5
Иногда это связано с вашим "Наследовать от цели". Это значение должно быть установлено. В приложениях с одной целью вы можете просто выбрать Inherit From Target. Если у вас более одной цели, выберите нужную цель.
Ответ 6
Если это приложение для iPhone, а не универсальное, убедитесь, что следующее поле пуст:
Цели > Сводкa > Информация о развертывании iPhone/iPod > Основной интерфейс
Если вы укажете xib, он сработает.
Ответ 7
Эта ошибка указывает, что уже подключенный объект Interface Builder удаляется/переименовывается в его источнике владельца (владелец файла).
Управляйте щелчком по Владелец файлов в построителе интерфейса, если вы видите восклицательный знак , который вам нужно исправить.
На рисунке ниже вы видите, что "aRemovedView" имеет восклицательный знак справа от него, потому что я удалил объект представления IBOutlet, когда он уже был подключен в IB.
Это дает следующую ошибку:
Завершение приложения из-за неотображенного исключения "NSUnknownKeyException", причина: "[setValue: forUndefinedKey:]: этот класс не является ключевым значением, совместимым с кодировкой для ключа aRemovedView. '
Ответ 8
У меня была такая же проблема, и хотя ответ TechZen действительно может быть потрясающим, мне было трудно применить мою ситуацию.
В конце концов я решил проблему, связав метку с помощью контроллера, указанного в разделе Объекты (выделенном на изображении ниже), а затем через Владелец файла.
Надеюсь, это поможет.
Ответ 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
Мои исправления были похожи на Жерара Гранди. При создании пользовательского 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].
Решение состоит в том, чтобы удалить старое свойство.
Откройте инспектор идентификации для вашего класса, выберите имя свойства в разделе "Определенные пользователем атрибуты времени выполнения" и нажмите кнопку "минус" (-).
Ответ 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
У меня такая же проблема. Я сбросил симулятор. Удаление и добавление кнопки управления. и, наконец, сделал чистый.:) Благодаря переполнению стека. Некоторые о том, как мой код стал нормально и начал работать.