Я пытаюсь связать UILabel
с IBOutlet
созданным в моем классе.
Мое приложение падает со следующей ошибкой.
Что это значит?
Как я могу это исправить?
*** Завершение работы приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: этот класс не соответствует значению ключа, соответствующему кодированию для ключа XXX».
ios
macos
cocoa
cocoa-touch
interface-builder
Гийом Дюбуа
источник
источник
Ответы:
Ваш контроллер представления может иметь неправильный класс в вашей XIB.
Я скачал твой проект.
Вы получаете ошибку
Это вызвано тем, что
Second
контроллер представленияMainWindow.xib
имеет классUIViewController
вместоSecondView
. Переход на правильный класс решает проблему.Кстати, это плохая практика - иметь такие имена, как «строка» в Objective-C. Это вызывает столкновение именования во время выполнения. Избегайте их даже в разовых тренировочных приложениях. Названия коллизий могут быть очень трудно отследить, и вы не хотите тратить время.
Другая возможная причина этой ошибки: при копировании и вставке элементов из одного контроллера в другой, Xcode каким-то образом сохраняет эту ссылку на исходный контроллер, даже после редактирования и повторной привязки этого элемента в новый контроллер.
Другая возможная причина этой ошибки:
Bad Outlet.
Вы удалили или переименовали название торговой точки в своем
.h
файле.Удалите его
.xib
или.storyboard
инспектор подключений файла.Еще одна возможная причина
(В моем случае) Расширение UIView с привязываемыми свойствами и установочными значениями для этих привязываемых свойств (например, тени, радиуса угла и т. Д.) Затем удаляет эти свойства из расширения UIView (по некоторым причинам), но
<userDefinedRuntimeAttributes>
в xml (offoo.storyboard
) осталось следующее :Решение: Щелкните правой кнопкой мыши
foo.storyboard
> Открыть как исходный код> Поиск по ключевому пути (например, shadowRadius)> Удалить объект</userDefinedRuntimeAttributes>
, вызвавший проблему.источник
У вас может быть плохая связь в вашей XIB.
У меня была эта ошибка много раз. Хотя ответ TechZen в этом случае абсолютно верен, другой распространенной причиной является изменение имени свойства IBOutlet в вашем .h / .m, которое вы уже подключили к владельцу файла в nib.
Из твоего пера:
В разделе «Ссылочные выходы» убедитесь, что ваш объект по-прежнему не связан со старым именем свойства ... если это так, нажмите маленькую «x», чтобы удалить ссылку и построить заново.
Еще одна распространенная причина, если вы используете раскадровку, ваша UIButton может иметь более одного назначения (решение почти такое же, как для nib):
Вы увидите, что этой кнопке назначено несколько ссылок / ссылок. Удалите одно из серых окон "Main ..." с маленькой буквой "x":
источник
Мне пришлось удалить приложение из симулятора / iPhone, чтобы избавиться от этой ошибки.
источник
У меня была эта ошибка, когда я пытался реализовать пользовательский ViewCell для таблицы. Когда я выделил View controller для XIB и подключился к элементам в CellView, возникла ошибка «этот класс не соответствует значению ключа для кода», как только я удалил их, он избавился от ошибки.
Удалите соединения на изображении ниже.
Просто убедитесь, что у вас есть только соединения с ячейкой табличного представления. Чтобы проверить, нажмите на ячейку табличного представления и в INSPECTOR ищите свои соединения.
источник
Иногда это связано с вашим «Наследовать от цели». Это значение должно быть установлено. В приложениях с одной целью вы можете просто выбрать Inherit From Target. Если у вас более одной цели, выберите нужную цель.
источник
Если это приложение только для iPhone, а не универсальное, убедитесь, что следующее поле не заполнено:
Цели> Сводка> Информация о развертывании iPhone / iPod> Главный интерфейс
Если вы укажете XIB там, он падает.
источник
Эта ошибка указывает на то, что уже подключенный объект Interface Builder удален / переименован в источнике его владельца (Владелец файла).
Удерживая нажатой клавишу « Control», щелкните «Владелец файлов» в Interface Builder, если вы видите восклицательный знак, который необходимо исправить.
На рисунке ниже вы можете видеть, что «aRemovedView» имеет восклицательный знак справа, потому что я удалил объект представления IBOutlet, когда он уже был подключен в IB.
Это приводит к следующей ошибке: Завершение работы приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[setValue: forUndefinedKey:]: этот класс не совместим с кодированием значения ключа для ключа aRemovedView.»
источник
У меня была та же проблема, и, хотя ответ TechZen действительно может быть удивительным, мне было трудно применить к моей ситуации.
В конце концов я решил проблему, связав метку через контроллер, указанный в разделе « Объекты» (выделенный на рисунке ниже), а не через владельца файла .
Надеюсь это поможет.
источник
в моем случае это была ошибка в исходном коде раскадровки, выполните следующие действия:
<connections>
Например:
Как видите, это связи между именами переменных вашего кода и тегами xml макета раскадровки;)
источник
Мое исправление было похоже на исправление Джерарда Гранди. При создании пользовательского UITableViewCell с использованием XIB я по ошибке применил имя пользовательского класса к владельцу файла, а не к UITableViewCell. Применение класса к UITableViewCell на холсте и подключение к нему моих свойств IBOutlet решило проблему.
источник
IBOutlet
один раз,IBOutlet
ярлык вашего ивара не нужен.UIViewController
? В какой-то момент вы должны звонить[SecondView initWithNibName:@"yourNibName" bundle:nil];
источник
-initWithNibName
с неправильным именем пера.Это происходило со мной только при отладке на устройстве (iPhone). Симулятор iOS работал нормально. Казалось, что решение «Product-> Clean» из Xcode решило проблему, но я понятия не имею, почему.
источник
У меня было точно такое же сообщение об ошибке, и благодаря (!!) Кире с http://www.idev101.com я смог решить проблему. Я нашел ее сайт только после того, как погуглил и сложил все эти темы. Сейчас я публикую здесь следующую статью, которая относится к StackOverFlow и имеет ту же проблему, с которой я столкнулся, поскольку этот человек, скорее всего, перейдет в эту ветку через Google.
Я понял, что ошибочно сделал это:
Вместо этого:
куда
Было ли название моего класса также известен как
Вам придется
в вашей реализации (файл .m), где вы хотите вызвать, например, другой UIViewController.
Я абсолютно не сожалею, если я только излагаю очевидное для начинающих, таких как я, и могу получить голоса, поскольку это не совсем связано с вопросом, но я искал 4 (?!?) Часа прямо сейчас, чтобы найти ответ на это сообщение об ошибке. , Если бы я мог сэкономить это 1 или 2 людям, это было бы здорово :)
PS: Для тех, кто интересуется продолжением кода для загрузки другого UIViewController:
источник
Это может происходить из-за того, что вы перетаскивали элемент управления и создали розетку или действие и забыли удалить его. Даже если вы удалили код или даже сделали достаточно cmd + Z, вам нужно зайти в инспектор соединений вашей раскадровки и посмотреть, все ли созданное вами действие или розетка все еще здесь или нет.
источник
Просматривая другие ответы, кажется, что есть много вещей, которые могут вызвать эту ошибку. Вот еще один.
если ты
Тогда вы также можете получить ошибку, аналогичную
Решение состоит в том, чтобы удалить старое свойство.
Откройте инспектор удостоверений для своего класса, выберите имя свойства в разделе «Определенные пользователем атрибуты времени выполнения» и нажмите кнопку «минус» (-).
источник
Это происходит со мной, когда у моего контроллера представления изначально был файл .xib, но теперь он создается программно.
Хотя я удалил файл .xib из этого проекта. Пользователи iPhone / iPad могут содержать файлы .xib для этого viewcontroller.
Попытка загрузить файл .xib обычно приводит к сбою:
Решение при его создании программно может быть таким:
источник
Свойство «Модуль» View Controller в Identity Inspector может отличаться от ожидаемого. Также убедитесь, что новые классы добавлены в ваш целевой список.
источник
У меня была похожая проблема для проекта, который имеет две цели (со своим собственным MainWindow XIB). Основная проблема, которая вызвала у меня эту ошибку, заключалась в том, что класс UIViewController не был включен в список ресурсов второго проекта. Т.е. конструктор интерфейса позволил мне указать это в MainWindow.xib, но во время выполнения система не смогла найти класс.
Т.е. cmd-клик по рассматриваемому классу UIViewController и дважды проверьте, что он включен на вкладке «Цели».
источник
Просто чтобы добавить к этому, потому что я тоже получал эту ошибку. Прохождение всех этих ответов, кажется, наиболее применимо к работе с пользовательским интерфейсом и раскадровкой. Я знаю, что оригинальный постер действительно работал с пользовательским интерфейсом, но при поиске возможных причин этой ошибки, в основном, все вопросы возвращаются к этому вопросу, когда другие закрываются как дубликаты или просто возникают проблемы с подключением объектов в раскадровке, поэтому я буду добавь мое решение.
Я работал над кодированием веб-службы в Swift 2. Я создал все необходимые прокси-объекты и заглушки. Проходя по возвращенному XML, я динамически создавал экземпляры своих объектов, которые все пришли
NSObject
и использовалиsetValue:forKey
их. Каждый раз, когдаsetValue:forKey
пытался установить свойство, оно взрывалось с этой ошибкой.Я имел переключатель заявление для каждого типа я имел дело с (например
Bool?
,CShort?
,String?
) и для каждого узла XML я прошел и проверил , что тип был на объекте , а затем преобразуется в значение этого типа и попытался установить егоsetValue:forKey
.В конце концов я начал комментировать все эти
setValue:forKey
строки и обнаружил, что мойdefault
случай оператора switch сработалString?
.В конце концов я понял, что вы не можете использовать необязательные типы swift,
setValue:forKey
если они не имеют прямого сопоставления с типом Objective-C, напримерString?
илиNSNumber?
. Я закончил тем, что изменил всеCShort?
типы,NSNumber?
так как это имеет прямое отображение. Потому чтоBool?
в моем случае это было хорошо для меня, чтобы просто использоватьBool
и инициализировать егоfalse
. Другие могут не иметь такой роскоши.В любом случае, какая головная боль была такой, надеюсь, это поможет кому-то еще, кто имеет подобную проблему и постоянно перенаправляется на этот вопрос и говорит себе: «Я ничего не делаю в пользовательском интерфейсе !!».
Итак, наконец, еще раз повторить, что Key-Value Coding не работает с опциями. Ниже я в конечном итоге нашел где-то, но я забыл, где так, чтобы кто бы ни опубликовал это, я извиняюсь и воздаю должное, если бы я вспомнил, где я нашел это, но это спасло мою жизнь:
источник
«этот класс не соответствует значению ключа, соответствующему кодированию для ключа» Я знаю, что он немного запоздал, но мой ответ другой, поэтому я думаю, что его нужно опубликовать, я неправильно нажимал на второй контроллер. Вот пример
Неправильный способ подтолкнуть контроллер
Правильный путь
Я не нашел ни одного ответа, как указано выше, поэтому может быть, он может помочь кому-то, имеющему ту же проблему
источник
Это может быть в случае ссылки на компонент из интерфейса Xib, который вы переименовали или удалили. Повторная ссылка работает для меня.
источник
Я только что столкнулся с этой проблемой в моем дублированном проекте и решил, проверив 2 места:
1- Убедитесь, что у вас есть файл .m в списке -> Проект - Этапы сборки - Исходники компиляции.
2- После этого перейдите к построителю интерфейса (возможно, это ошибка только с IB) и отсоедините все свойства, метки, изображения. и т. д. Тогда перепроверьте все. Я понял, что удалил атрибут, но он все еще был связан в IB.
Надеюсь, что это работает для некоторых.
источник
Еще одна проблема «не соответствует», которую я обнаружил, когда по какой-то причине мне удалось получить две копии класса.
Я добавлял ключи не к той копии. Интерфейсный Разработчик все еще видел ключи и позволял мне подключать их, но во время выполнения он использовал другую копию класса, у которой не было новых ключей.
Чтобы найти «правильную» копию, я использовал cmd-щелчок XCode по имени класса в другом месте, чтобы перейти к правильной копии, а затем уничтожил неиспользуемые копии (сначала перенеся мои правки из неиспользованной копии).
Мораль истории: дубликаты файлов классов плохие.
источник
Эта ошибка - что-то еще!
Вот как я это исправил. Я использую XCode версии 6.1.1 и использую Swift. Я получал эту ошибку каждый раз, когда мое приложение пыталось выполнить переход, чтобы перейти к следующему экрану. Вот что я сделал.
Ура,
источник
У меня был такой же симптом. Основной причиной было то, что «Целевое членство» для моего исходного файла не было установлено на правильную цель. Я предполагаю, что это означает, что мой класс не будет построен и включен в мое приложение.
Чтобы исправить это:
Надеюсь, это поможет кому-то там.
источник
Если у вас есть собственный подкласс UIViewController с IBOutlets, который вызывает проблемы, единственное, что я обнаружил, чтобы на самом деле избавиться от ошибки, было
.1 Изменить класс на UIViewController
.2 Отключите все розетки (теперь все они будут иметь желтый предупреждающий треугольник) - может быть достаточно просто отключить проблемные розетки.
.3 Выполнить все стандартные шаги - ⌘ ⌘K, удалить производные данные (молитвенные маты, тревожные бусы)
.4 Запустите приложение - перейдите на проблемную сцену.
.5 Убейте приложение, вернитесь в Интерфейсный Разработчик, измените класс на свое имя класса.
.6 Подключите свои розетки.
Запустите приложение, и это, как правило, устранит проблемы соответствия ключ-значение.
источник
В моем случае. У меня не было пропущенных розеток в xib-файлах после слияния.
решил мою проблему. Я очистил свой проект и восстановил.
источник
В моем случае это было вызвано неправильной ссылкой на Nib:
источник
Я получал эту ошибку с раскадровками. Вышеприведенное решение, похоже, не было проблемой, поэтому я в итоге удалил контроллер представления и снова добавил его (и, конечно же, заново подключил segue и переназначил класс), что исправило его. Я не знаю, что это было на самом деле, но я переименовал соответствующий класс контроллера представления незадолго до того, как это началось, так что, возможно, это что-то скрыло.
источник
У меня та же проблема. Я сделал сброс симулятора. Снятие и добавление кнопки управления. и наконец сделал чистку. :) Благодаря переполнению стека. Некоторые, как мой код стал нормальным и начал работать.
источник