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

1173

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

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

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

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

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

Гийом Дюбуа
источник
11
pedrotorres прав. Да, это правильно. Если вы делаете UITableViewCell, в IB не забудьте указать владельца файла для NSObject, а UITableViewCell'Class - для класса .h, который вы определили.
Джузеппе
3
Когда вы сталкиваетесь с такой проблемой, и неисправный ключ является действием, а не розеткой, то, скорее всего, у вас есть розетка, которая ошибочно ссылается на имя вашей функции действия вместо имени вашей выходной переменной.
Алекс Юрша
2
Вы должны заметить, что имя ключа в сообщении об ошибке (OP называет его «XXXX») - это имя, которое вы дали чему-то в вашем nib-файле. Это должно помочь сузить ваш поиск.
Крис
Я подал rdar: // 22105925 с просьбой Apple сделать эти ошибки более очевидными во время сборки. :)
Jtbandes
как на самом деле НЕМЕДЛЕННО РЕШИТЬ проблему! stackoverflow.com/a/13812660/294884 фантастический совет
Толстяк

Ответы:

980

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

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

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

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

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

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

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

Другая возможная причина этой ошибки:

Bad Outlet.

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

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

Еще одна возможная причина

(В моем случае) Расширение UIView с привязываемыми свойствами и установочными значениями для этих привязываемых свойств (например, тени, радиуса угла и т. Д.) Затем удаляет эти свойства из расширения UIView (по некоторым причинам), но <userDefinedRuntimeAttributes>в xml (of foo.storyboard) осталось следующее :

<userDefinedRuntimeAttributes>
  <userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
      <color key="value" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
      <real key="value" value="50"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="point" keyPath="shadowOffset">
      <point key="value" x="5" y="5"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
      <real key="value" value="16"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="borderWidthValue">
      <real key="value" value="0.0"/>
  </userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>

Решение: Щелкните правой кнопкой мыши foo.storyboard> Открыть как исходный код> Поиск по ключевому пути (например, shadowRadius)> Удалить объект </userDefinedRuntimeAttributes>, вызвавший проблему.

Hassan Tareq
источник
9
Также не забудьте подключить выход «view» пера к выходу представления владельца файла (выход представления вашего пользовательского класса, унаследованного от UIViewController). Это можно сделать путем перетаскивания элемента управления «Владелец файла» в разделе «Заполнители» в «представление» в разделе «Объекты» и выбора точки просмотра.
Нирма
1
Я удостоверился, что все классы уже установлены, но NSUnknownKeyException все еще появляется :(
Zennichimaro
1
Я даже не использую Интерфейсный Разработчик, и я все еще получаю эту ошибку. Есть идеи, что происходит?
Судо
12
Ничего. Это было из-за двух вещей: XCode все еще обращался к моей основной раскадровке, хотя она была удалена из проекта, и симулятор имел ее в кеше. Я настоятельно не рекомендую использовать раскадровки или NIB - они смехотворно проблематичны.
Судо
5
@ Джош Лол. Каждый раз, когда я работаю над мотивацией для создания нативного приложения в xcode, это всегда заканчивается тем, что я трачу день, пытаясь понять, как что-то сделать. Я ac # dev, поэтому в последнее время я искал предложения от Xamarin и Telerik (nativescript).
Маффин Ман
1524

У вас может быть плохая связь в вашей XIB.

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

Из твоего пера:

  1. Выберите объект в IB и перейдите в «Инспектор соединений».
  2. В разделе «Ссылочные выходы» убедитесь, что ваш объект по-прежнему не связан со старым именем свойства ... если это так, нажмите маленькую «x», чтобы удалить ссылку и построить заново.

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

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

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

    пример 2

OhadM
источник
1
Спасибо! В моем случае у меня было 2 выхода к одному и тому же виду, и избавление от старого и подключение к новому завершило исключение.
Марк Паттерсон
мой был продублирован дважды. Я начал отключать каждую из них после того, как перетащил ее из версии Pro (из версии Lite), думая, что она зависает в соединениях в другом проекте. Когда я наткнулся на дубликат, и мне потребовалось 3 щелчка, чтобы отключиться, я искренне пожалел, что сделал это за 3 дня до этого. Ну что ж, такова жизнь дэва.
Aremvee
У меня была проблема, что у UIButton было больше чем одно назначение. Это решило мою проблему.
Мифический
У меня тоже была эта пробема. Не забудьте проверить розетки в отдельных видах, а не только в суперпредставлениях. В моем случае, супервьюзы не показывали неправильные связи = /
Аугусто Кармо
У меня была похожая ошибка, когда я подключил розетку кнопки к неправильному файлу ViewController swift, страница которого еще не была бы создана с использованием графического интерфейса
brw59
114

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

Стив Роджерс
источник
1
+1 это исправило это для меня. Я очищал код, который использовал IB. Когда я удалял кнопку из кода, ошибка продолжала появляться, даже если на эту кнопку вообще не было ссылок в файлах пера (по крайней мере, что я мог видеть).
воскресенье-понедельник,
2
Я считаю, что это необходимо, если вы отлаживаете два приложения с одинаковым именем.
Антон
Да, кажется, что что-то из XIB кэшируется на симуляторе, что является болью, если вы тестируете обновления, так как на самом деле вам не нужно удалять старое приложение.
Карлос П
У меня была проблема с удалением моего файла XIB. Это решило проблему.
Бальбоа
4
Если удаление приложения не работает, попробуйте удалить папку XCode DerivedData. который может кэшировать неправильный файл XIB. Откройте XCode -> «Настройки» -> «Местоположения» -> откройте папку DerivedData и перетащите ее в корзину.
Филипп Фунг
107

У меня была эта ошибка, когда я пытался реализовать пользовательский ViewCell для таблицы. Когда я выделил View controller для XIB и подключился к элементам в CellView, возникла ошибка «этот класс не соответствует значению ключа для кода», как только я удалил их, он избавился от ошибки.

Удалите соединения на изображении ниже. Удалить подключения в Инспекторе, когда выделен Владелец файла

Просто убедитесь, что у вас есть только соединения с ячейкой табличного представления. Чтобы проверить, нажмите на ячейку табличного представления и в INSPECTOR ищите свои соединения.

Соединение должно быть здесь, когда выделена ячейка табличного представления.

uplearnedu.com
источник
4
Это сделало это для меня, большое спасибо. Я удалил соединения, когда в левом столбце был выбран «Владелец файла», затем выбрал собственную ячейку и снова их подключил. Успех!
Рогаре
Даже с xcode7 это работает, просто используйте правую панель «Инспектор соединений». Снимите розетку с таблички и на этикетке, затем добавьте ее снова, и все должно работать.
lifeisfoo
3
Это работает, но вы должны убедиться, что FileOwner не установлен !! Владелец файла должен оставаться NSObject. stackoverflow.com/questions/13793162/...
devjme
Один и тот же ответ спас меня дважды!
wm.p1us
99

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

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

Shruti Thombre
источник
Этот ответ помог мне для конкретного случая. Я должен продолжать работать над старым проектом obj-c с несколькими целями. Я создаю пользовательский UITableViewCell в Swift, и у меня была та же ошибка. Включив «Наследовать от цели», он работал. Спасибо!
magohamoth
Модуль не всегда установлен правильно; например, если вы заполняете имя класса перед тем, как создавать его.
Йохан
Я заполнил имя класса, не нажимая клавишу «Ввод» в конце, поэтому IDE не проверил этот флаг автоматически. Потрачено на это 1 час. Спасибо.
MatPag
Никогда не сталкивался с таким типом ошибки в obj-c. Но благодаря его разгадана тайна.
Прадип Качаваха
почему это похоронено на 3-й странице?
Серхио
65

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

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

Если вы укажете XIB там, он падает.

erkanyildiz
источник
2
Да, это было для меня. Не останавливаясь, чтобы добавить новый контроллер вида запуска, я установил для него новый класс / nib. После подключения к розетке я столкнулся с этой ошибкой. Очистка этого поля исправила это.
страшная
Это сработало для меня. Обратите внимание, что мне также пришлось удалить старую версию из устройства / симулятора для его работы.
Джимт
Спасибо - это была моя проблема. Я переименовал файл раскадровки на iPad и не обновил его в настройках своего проекта.
Роберт Джозеф
2
Спасибо! Это решило это для меня. (Мне пришлось удалить приложение из симулятора после изменения поля Main Interface на пустое. Простое изменение этого поля не заставляло симулятор нарушать кеш.)
snipe
Я вспомнил, что я изменил вещи с универсального приложения на приложение только для iphone, и это исправило ошибку!
Джастин
59

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

Удерживая нажатой клавишу « Control», щелкните «Владелец файлов» в Interface Builder, если вы видите восклицательный знак, который необходимо исправить.

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

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

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

Тибидабо
источник
Спасибо! Это исправило это для меня. У меня была эта проблема в течение долгого времени, и я не знал, как ее исправить, кроме как начать с нуля. Это все, он удалил IBOutlets из контроллера представления, но не знал, что они все еще были связаны / связаны в владельце (в этом случае «View Controller» в конструкторе интерфейса - Xcode 6).
Ира Герман
41

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

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

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

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

Эрик Бротто
источник
37

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

  1. сначала откройте свою раскадровку как исходный код
  2. ищи <connections>
  3. удалить нежелательные соединения

Например:

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

тарифицировали намрути
источник
33

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

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

ashack
источник
Ayyy dag nab it ... Не могу поверить, как часто я делаю эту ошибку. Спасибо, лол
Бенджамин
31
  1. Вам нужно только указать IBOutletодин раз, IBOutletярлык вашего ивара не нужен.
  2. Вы инстанцируете свой NIB, используя свой UIViewController? В какой-то момент вы должны звонить[SecondView initWithNibName:@"yourNibName" bundle:nil];
куби
источник
Это помогло! Я получал ошибку соответствия код-значение для свойства из другого контроллера представления. Оказывается, я звонил -initWithNibNameс неправильным именем пера.
jlstrecker
Да, это мне тоже помогло .. я использовал UIViewController вместо MyCustomeViewController ... но это своего рода проблема иерархии может быть ... Самоанализ не удался из-за пропущенного объекта класса. В любом случае, спасибо
Futur
У меня была похожая проблема. Две одинаковые записи IBAction случайно. Не отображается в коде, только при щелчке правой кнопкой мыши UIControl (UIStepper в моем случае). Просто удалив один исправил это.
Дейв Хаббард
30

Это происходило со мной только при отладке на устройстве (iPhone). Симулятор iOS работал нормально. Казалось, что решение «Product-> Clean» из Xcode решило проблему, но я понятия не имею, почему.

Maj
источник
Это решит мою проблему. tsk2x почти 3 дня головной боли.
user3818576
5
Это дает ответ на вопрос. Что-то запуталось в Nib, и чистка решила это. Я прочитал и попробовал все вышеперечисленное безрезультатно, а затем сделал чистку, и после 1 часа попытки исправить это решение Мадж исправило это. Мне бы очень хотелось посмотреть, что в XML могло вызвать это, но я пошел дальше.
LevinsonTechnologies
Это действительно решает проблему - я попробовал многочисленные предложения выше, и только проект смог исправить эту ошибку, которая внезапно начала происходить. Тьфу ...
DustinB
Это решило мою проблему, я попробовал много вышеупомянутых предложений. Кажется странным
Навин Шан
23

У меня было точно такое же сообщение об ошибке, и благодаря (!!) Кире с 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];
Яннис
источник
СПАСИБО за все эти шаги, я использовал Xcode 5 и не знал, как вручную добавить перо, поскольку вы можете добавить раскадровку только по умолчанию .... У меня есть некоторые инструкции, но не такие подробные, как у вас. Действительно помог !!
Pittfall
«Я ошибся в этом…» спасибо, я не первый раз трачу много
денег
23

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

Иланский Нафтали
источник
Спасибо! Я n00b на Xcode и мне понадобилось время, чтобы найти мошеннические ссылки. В Xcode 9.2 вы можете щелкнуть правой кнопкой мыши по элементу в представлении раскадровки и проверить «Ссылочные выходы».
Кунигами
21

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

если ты

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

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

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

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

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

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

Suragch
источник
Я так часто заходил на эту страницу ... На этот раз это решение пришло! Но как бы странно это ни звучало, старое свойство, которое нужно удалить, было на самом деле на другом ViewController, а не на том, на котором он вылетает, я понятия не имею, почему.
Цинн
15

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

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

ercu
источник
голосование, так как это было так в моем случае. Я использую Swift и раскадровки. Когда я создал новую цель сборки (чтобы сделать вариант сборки), приложение не работало в новом варианте, в то время как первый работал нормально. Сбой приложения произошел на View Controller, где имя модуля было каким-то образом установлено на модуль от первой цели, тогда как в рабочих View Controllers это было Current - <имя модуля здесь> . В этом случае вам нужно стереть там имя модуля.
Mixaz
11

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

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

Дэвид Карни
источник
9

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

Я работал над кодированием веб-службы в 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 не работает с опциями. Ниже я в конечном итоге нашел где-то, но я забыл, где так, чтобы кто бы ни опубликовал это, я извиняюсь и воздаю должное, если бы я вспомнил, где я нашел это, но это спасло мою жизнь:

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

типы классов, производные от NSObject

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

Быстрые структуры, которые соединены

AtheistP3ace
источник
1
Если вы пытаетесь связать значение Swift bool через привязки Какао, вам нужно предоставить его с помощью директивы @objc; в противном случае вы действительно получите эту ошибку. Это должен быть лучший ответ.
Джварела
9

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

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

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

Я не нашел ни одного ответа, как указано выше, поэтому может быть, он может помочь кому-то, имеющему ту же проблему

Мухаммед Аммад
источник
8

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

MehrozKarim
источник
8

Я только что столкнулся с этой проблемой в моем дублированном проекте и решил, проверив 2 места:

1- Убедитесь, что у вас есть файл .m в списке -> Проект - Этапы сборки - Исходники компиляции.
2- После этого перейдите к построителю интерфейса (возможно, это ошибка только с IB) и отсоедините все свойства, метки, изображения. и т. д. Тогда перепроверьте все. Я понял, что удалил атрибут, но он все еще был связан в IB.

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

Kubilay
источник
7

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

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

Чтобы найти «правильную» копию, я использовал cmd-щелчок XCode по имени класса в другом месте, чтобы перейти к правильной копии, а затем уничтожил неиспользуемые копии (сначала перенеся мои правки из неиспользованной копии).

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

Джейсон
источник
7

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

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

  1. Проверено, что кнопка была подключена к правильному действию (это не было проблемой, но все еще хорошо проверить)
  2. Убедитесь, что у кнопки нет никаких дополнительных действий или выходов, которые вы, возможно, создали по ошибке. (Это не было проблемой, но все же хорошо проверить)
  3. Проверьте журналы и убедитесь, что все кнопки на СЛЕДУЮЩЕМ ЭКРАНЕ имеют правильные действия, и если есть какие-либо переходы, убедитесь, что у них есть уникальный идентификатор. (Это была проблема)
    • Один из сегментов не имел уникального идентификатора
    • У одной из кнопок было действие и два выхода, которые я создал по ошибке.
    • Удалите все дополнительные выходы и убедитесь, что переходы к следующему экрану имеют уникальные идентификаторы.

Ура,

Ronaldoh1
источник
6

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

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

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

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

Майк М. Лин
источник
6

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

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

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

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

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

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

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

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

Дамо
источник
Это работало при копировании и вставке сцены в редакторе раскадровки.
Мизмор
5

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

Shift + Command + K

решил мою проблему. Я очистил свой проект и восстановил.

оборота user123456
источник
4

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

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
wspruijt
источник
1
Случается со мной, когда я переименовываю класс контроллера представления и забываю, что имя пера тоже нужно изменить. Поскольку имя пера - это просто строка, ошибки компилятора нет.
Крис
3

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

симметричный
источник
Я снова получил эту ошибку. На этот раз я создал новый пустой контроллер табличного представления с назначенным ему классом, оставив нерабочий в покое, и перенес в него переход. Это сработало. Затем я медленно скопировал каждый элемент в представлении, пока он снова не вышел из строя. На этот раз проблема оказалась в том, что я назначил некоторые «Определенные пользователем атрибуты времени выполнения» для средства выбора (я думал, что смогу использовать их для инициализации средства выбора, чтобы мне не пришлось делать это в коде, не знаю, возможно ли это ). Удаление, которое решило проблему. Эта ошибка действительно ужасна, надеюсь, она будет исправлена ​​в следующем выпуске!
Симметричный
3

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

прийа
источник