Что это значит? "'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.
от вашего пера:
- Выберите объект в IB и перейдите в раздел "инспектор соединений".
-
Под 'Привязки Розеток' убедитесь, что объект не подключен к старому имени свойства... если это так, нажмите маленький "x", чтобы удалить ссылку и снова строить.
еще одна распространенная причина если вы используете раскадровку, ваш UIButton может иметь несколько назначений (решение почти такое же, как для nib):
У меня была эта ошибка, когда я пытался реализовать пользовательский ViewCell для таблицы. Когда я выделил контроллер вида для XIB и подключился к элементам в CellView, вызвал ошибку "этот класс не соответствует кодированию ключевого значения для ключа", как только я удалил их, он избавился от ошибки.
удалите соединения на изображении ниже.
просто убедитесь, что у вас есть только соединения с ячейкой представления таблицы. Для проверки нажмите на вид таблицы сотовый и инспектор ищут ваши связи.
Если это приложение только для iPhone, а не универсальное, убедитесь, что следующее поле пусто:
цели > сводка > информация о развертывании iPhone / iPod > основной интерфейс
Если вы укажете xib, он аварийно завершит работу.
эта ошибка указывает, что уже подключенный построитель интерфейса объект удаляется / переименовывается в источнике своего владельца (владельца файла).
Control-нажмите на файлы в Построителе интерфейса, если вы видите восклицательным знаком вы должны исправить это.
на рисунке ниже вы можете видеть, что "aRemovedView" имеет восклицательный знак справа, это потому, что я удалил объект представления IBOutlet, когда он уже был подключен В IB.
Это дает следующую ошибку: завершение приложения из-за необнаруженного исключения "NSUnknownKeyException", причина: "[setValue:forUndefinedKey:]: этот класс не соответствует кодированию ключевого значения для ключа aRemovedView.'
У меня была та же проблема, и хотя ответ TechZen действительно может быть удивительным, мне было трудно применить к моей ситуации.
В конце концов я решил проблему, связав метку через контроллер, указанный в разделе объекты (выделено на изображении ниже), а не через Владелец Файла.
надеюсь, что это помогает.
в моем случае это была ошибка в исходном коде раскадровка, выполните следующие действия:
- сначала откройте свою раскадровку в качестве исходного кода
- искать
<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-тегами раскадровки раскадровки;)
Это происходило со мной только при отладке на устройстве (iPhone). Симулятор iOS работал нормально. Выполнение "Product - > Clean" из Xcode, казалось, решило проблему, но я понятия не имею, почему.
- вам нужно только указать
IBOutlet
разIBOutlet
ярлык вашего ivar не нужен. - ты инстанцирования ваш НИБ используя
UIViewController
? В какой-то момент Вы должны позвонить[SecondView initWithNibName:@"yourNibName" bundle:nil];
мое исправление было похоже на исправление Джерарда Гранди. При создании пользовательского 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].
решение состоит в том, чтобы удалить старое свойство.
откройте инспектор удостоверений для своего класса, выберите имя свойства в разделе пользовательские атрибуты среды выполнения и нажмите кнопку минус (-).
свойство"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. Я получил эту ошибку каждый раз, когда мое приложение пыталось выполнить переход, чтобы перейти к следующему экрану. Вот что я сделал.
- проверил, что кнопка была подключена к правильному действию.(Это не было проблемой, но все равно хорошо проверить)
- убедитесь, что на кнопке нет дополнительных действий или точек, которые вы могли создать по ошибке. (Этот не было проблемы, но все равно хорошо проверить)
- Проверьте журналы и убедитесь, что все кнопки на следующем экране имеют правильные действия, и если есть какие-либо сегменты, убедитесь, что они имеют уникальный идентификатор. (Это было проблемой)
- один из сегментов не имел уникального идентификатора
- одна из кнопок имела действие и два выхода, которые я создал по ошибке.
- удалите все дополнительные розетки и убедитесь, что вы сегментируете следующий экран имеет уникальные идентификаторы.
спасибо,
просто чтобы добавить к этому, потому что я получаю эту ошибку. Пройдя через все эти ответы, большинство из них, похоже, относится к работе с 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];
Я не нашел ответа, как указано выше, поэтому, возможно, это может помочь кому-то с той же проблемой
У меня был тот же симптом. Основной причиной было то, что" целевое членство " для моего исходного файла не было установлено на правильную цель. Я предполагаю, что это означает, что мой класс не будет построен и включен в мое приложение.
чтобы исправить это:
- подчеркнуть вашу .m-файл.
- в правой панели, выберите Файл инспектор.
- в разделе "целевое членство" убедитесь, что выбрана соответствующая цель сборки.
надеюсь, что это помогает кому-то там.
в моем случае. У меня не было отсутствующих выходов в xib-файлах после слияния.
Shift + Command + K
решить мою проблему. Я очистил свой проект и восстановил его.
Если у вас есть пользовательский подкласс UIViewController с IBOutlets, которые вызывают проблемы, единственным набором шагов, которые я нашел, чтобы фактически избавиться от ошибки, были
.1 измените класс на UIViewController
.2 Отключите все розетки (теперь все они будут иметь желтый предупреждающий треугольник) - может быть достаточно просто отключить проблемные розетки.
.3 Выполните все стандартные шаги - ↑ ⌘ k, удалите производные данные (, молитвенные коврики, беспокойство бисер)
.4 запустите приложение-перейдите на проблемную сцену.
.5 убейте приложение, вернитесь к Interface Builder измените класс обратно на имя пользовательского класса.
.6 подключите розетки.
запустите приложение , и это, как правило, прояснило проблемы соответствия ключевым значениям.
в моем случае это было вызвано ссылкой на неправильный перо:
BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
Я получал эту ошибку с раскадровками. Вышеприведенное решение, похоже, не было проблемой, поэтому я в конечном итоге удалил контроллер представления и добавил его снова (и, конечно, повторно подключил сегмент и переназначил класс), который исправил его. Я не знаю, что это было на самом деле, но я переименовал связанный класс контроллера вида незадолго до того, как это началось, так что, возможно, это было что-то.
У меня такая же проблема. Я сбросил симулятор. Удаление и добавление кнопки управления. и, наконец, сделал чистым. :) Благодаря переполнению стека. Некоторые, как мой код стал ОК и начал работать.