Xcode - Як виправити 'NSUnknownKeyException', причина:… цей клас не є ключовим значенням, кодування сумісно для помилки ключа X "?


1172

Я намагаюся зв’язати посилання UILabelзі IBOutletствореним у своєму класі.

У моїй програмі відбувається збій із наступною помилкою.

Що це означає?

Як я можу це виправити?

*** Завершення програми через невиконаний виняток 'NSUnknownKeyException', причина: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: цей клас не є ключовим значенням, сумісним з кодуванням для ключа XXX.'


11
педротор прав. Так, це правильно. Якщо ви робите UITableViewCell, у IB пам’ятайте, що власнику файлу належить NSObject, а UITableViewCell'Class - до вказаного вами класу .h.
giuseppe

3
Якщо ви стикаєтеся з такою проблемою, а ключ-образник - це дія, а не розетка, то, швидше за все, у вас є розетка, яка помилково посилається на назву функції дії замість назви змінної розетки .
Олексій Юрша

2
Ви повинні помітити, що ім'я ключа в повідомленні про помилку (ОП називає його "XXXX") - це ім'я, яке ви надали чомусь у вашому файлі nib. Це повинно допомогти звузити пошук.
kris

Я подав rdar: // 22105925 з проханням Apple зробити ці помилки більш очевидними під час збирання. :)
jtbandes

як насправді негайно вирішити проблему! stackoverflow.com/a/13812660/294884 фантастична порада
Fattie

Відповіді:


980

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

Я завантажив ваш проект.

Ви отримуєте помилку

'NSUnknownKeyException', причина: '[<UIViewController 0x3927310> setValue: forUndefinedKey:]: цей клас не відповідає кодуванню ключового значення для рядка ключа.'

Це викликано Secondконтролером перегляду у MainWindow.xibнаявності класу UIViewControllerзамістьSecondView . Перехід на правильний клас вирішує проблему.

До речі, погана практика мати такі імена, як "рядок", в "Objective-C". Він запрошує зіткнення, яке називає час виконання. Уникайте їх навіть у разових практичних програмах. Визначення зіткнень може бути дуже важким, і ви не хочете витрачати час.

Ще одна можлива причина цієї помилки: коли копіює та вставляє елементи з одного контролера в інший, Xcode якось зберігає це посилання на вихідний контролер, навіть після редагування та повторного посилання цього елемента на новий контролер.

Ще одна можлива причина цієї помилки:

Поганий вихід.

Ви або видалили або перейменували ім'я розетки у вашому .hфайлі.

Видаліть його з інспектора з’єднання .xibабо .storyboardфайлу.

Ще одна можлива причина

(У моєму випадку) Розширення UIView зі сполучними властивостями та встановленням значень цих властивостей, що підлягають сполученню (тобто тінь, радіус кута тощо), потім видаліть ці властивості з розширення UIView (чомусь), але наступне <userDefinedRuntimeAttributes>залишилось у xml (з 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> Відкрити як вихідний код> пошук по keyPath (тобто shadowRadius)> Видалити те, </userDefinedRuntimeAttributes>що спричинило проблему


9
Крім того, не забудьте підключити розетку "view" для ручки до розетки перегляду власника файлу (розетка перегляду вашого користувацького класу, успадкована від UIViewController). Це можна зробити за допомогою перетягування з «Власника файлу» у розділі «Власники місць» на «Перегляд» у розділі «Об’єкти» та вибору розетки перегляду.
Нірма

1
Я переконався, що всі класи вже встановлені, але NSUnknownKeyException все ж виходить :(
Zennichimaro

1
Я навіть не використовую Interface Builder, і я все ще отримую цю помилку. Будь-яка ідея, що відбувається?
судо

12
Не звертай уваги. Це було через дві речі: Xcode все ще отримував доступ до моєї основної розкадровки, навіть якщо її було видалено з проекту, а симулятор кешував її. Я вкрай не рекомендую користуватися розкадровками або NIB - вони смішно проблематичні.
судо

5
@Josh Lol Кожен раз, коли я працюю над мотивацією створити нативну програму в xcode, вона завжди закінчується тим, що я витрачаю день, намагаючись зрозуміти, як зробити що-небудь. Я ac # dev, тому останнім часом переглядаю пропозиції від Xamarin та Telerik (nativecript).
Людина-булочка

1524

У вас може бути поганий зв’язок у вашому xib.

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

Від вашої нитки:

  1. Виберіть об'єкт у IB та перейдіть до «Інспектора з’єднань».
  2. У розділі "Посилання на торгові точки" переконайтесь, що ваш об'єкт ще не пов'язаний зі старою назвою властивості ... якщо він є, натисніть маленький "x", щоб видалити посилання та створити його знову.

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

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

  1. Відкрийте свою дошку та клацніть правою кнопкою миші кнопку UIButton
  2. Ви побачите, що цій кнопці є більше одного призначення / відхилення. Видаліть одне із сірих вікон із "Основним ..." із малим "х":

    приклад 2


1
Дякую! У моєму випадку у мене було 2 відділення для того ж виду, і позбавлення від старої та підключення виду до нового закінчилося винятком.
Марк Паттерсон

міна дублювалася двічі. Я почав відключати кожен після того, як перетягнув з версії Pro (з версії Lite), думаючи, що він звисає на з'єднання в іншому проекті. Коли я натрапив на дублікат, і для відключення знадобилося 3 клацання, я щиро побажав зробити це на 3 дні раніше. О добре - таке життя дев.
aremvee

У мене виникла проблема, що UIButton мав більше одного призначення. Це вирішило моє питання.
mythicalcoder

У мене теж була ця проблема. Не забудьте перевірити розеткові з'єднання, зокрема конкретні представлення, а не лише перегляди. У моєму випадку нагляди не показували неправильних зв’язків = /
Augusto Carmo

У мене була подібна помилка, коли я підключив розетку кнопок до неправильного швидкого файлу ViewController, сторінка якого ще не була б створена за допомогою GUI
brw59

114

Мені довелося видалити додаток із симулятора / iPhone, щоб позбутися цієї помилки.


1
+1 це зафіксував для мене. Я прибирав код, який використовував ІБ. Коли я видалив кнопку з коду, помилка постійно вискакувала навіть тоді, коли ця кнопка взагалі не посилалася на файли нив (принаймні, що я міг бачити).
неділя, понеділок,

2
Я вважаю, що це необхідно, якщо ви налагоджуєте два програми, які мають однакову назву.
Антон

Так, здається, що щось із XIB є кешованим на тренажері, що болить, якщо ви тестуєте оновлення, оскільки ви насправді не хочете видаляти стару програму.
Карлос П

У мене виникла проблема зі видаленням мого файлу XIB. Це вирішило проблему.
balboa

4
Якщо видалення додатка не працює, спробуйте видалити папку XCode DerivedData. який може кешувати неправильний файл xib. Відкрийте XCode -> Налаштування -> Місцеположення -> Відкрийте папку DerivedData та перетягніть її в Кошик.
Філіп Фунг

107

У мене виникла помилка, коли я намагався реалізувати спеціальний ViewCell для таблиці. Коли я виділив контролер View для XIB та підключився до елементів у CellView, спричинив помилку "цей клас не є ключовим значенням, що відповідає кодуванню для ключа", коли я видалив їх, він позбувся помилки.

Видаліть з'єднання на зображенні нижче. Видаліть підключення інспектора, коли виділено Власник файлу

Просто переконайтеся, що у вас є лише з'єднання з коміркою "Перегляд таблиці". Щоб перевірити, натисніть на комірку перегляду таблиці та в INSPECTOR шукайте свої з'єднання.

З'єднання повинно бути тут, коли виділяється осередок перегляду таблиці


4
Це зробив це для мене, велике спасибі. Я вимкнув з'єднання, коли в лівому стовпці було вибрано "Власник файлу", потім вибрав власну клітинку і повторно встановив їх. Успіху!
Rogare

Навіть з xcode7 це працює, просто використовуйте праву панель «Інспектор підключень». Вийміть розетку з настільної таблиці та з мітки, після чого знову додайте її і все повинно працювати.
lifeisfoo

3
Це працює, але вам потрібно переконатися, що FileOwner не встановлений !! Власник файлу повинен залишатися NSObject. stackoverflow.com/questions/13793162 / ...
devjme

Та сама відповідь врятувала мене двічі!
wm.p1us

98

Іноді це пов’язано з вашим "Наслідком від цільового". Це значення потрібно встановити. За допомогою єдиних цільових додатків ви можете просто вибрати Спадщина із цільової. Якщо у вас більше однієї цілі, виберіть потрібну ціль.

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


Ця відповідь допомогла мені для конкретного випадку. Мені потрібно продовжувати працювати над старим проектом obj-c з декількома цілями. Я створюю власну UITableViewCell у Swift, і у мене була така ж помилка. Увімкнувши "Спадщина від цілі", вона спрацювала. Дякую!
magohamoth

Модуль не завжди встановлений правильно; наприклад, якщо ви заповнили ім'я класу, перш ніж створити клас.
Йоган

Я заповнив ім'я класу, не натискаючи клавішу "Enter" наприкінці, щоб IDE не перевірив цей прапор автоматично. На це витратили 1 годину. Дякую.
MatPag

Ніколи не стикався з таким типом помилок в obj-c. Але завдяки його розгадана таємниця.
Pradeep Kachhawaha

чому це поховано на 3-й сторінці?
Серхіо

65

Якщо це лише додаток для iPhone, а не універсальний, переконайтеся, що таке поле порожнє:

Цілі> Підсумок> Інформація про розгортання iPhone / iPod> Основний інтерфейс

Якщо ви вкажете там xib, він вийде з ладу.


2
Так, це було для мене. Під час розгортання, щоб додати новий контролер перегляду при запуску, я встановив це на новий клас / кнопочку. Після підключення розетки для перегляду я зазнав цієї помилки. Очистивши це поле, виправили його.
страшна

Це працювало для мене. Зауважте, що мені також довелося видалити стару версію з пристрою / симулятора, щоб вона працювала.
jimt

Спасибі - це була моя проблема. Я перейменував свій файл розкадровки iPad і не оновив у своїх префіксах проект.
RobertJoseph

2
Дякую! Це вирішило це для мене. (Мені довелося видалити додаток із тренажера після зміни поля основного інтерфейсу на порожнє. Просто зміна цього поля не змусила симулятор зламати кеш.)
бекас

Я згадав, що я змінив речі з універсальної програми на додаток лише для iphone, і це виправило помилку!
Джастін

59

Ця помилка вказує на те, що вже підключений об’єкт Builder інтерфейсу видаляється / перейменовується в його джерело (власник файлу).

Клацніть клавішею миші на власника файлів у програмі інтерфейсу, якщо ви побачите знак оклику, що вам потрібно це виправити.

На малюнку нижче ви бачите, що "aRemovedView" має знак оклику праворуч, це тому, що я видалив об'єкт подання IBOutlet, поки він вже був підключений у ІБ.

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

Це призводить до такої помилки: Запуск програми через невиконане виключення "NSUnknownKeyException", причина: "[setValue: forUndefinedKey:]: цей клас не є ключовим значенням, що відповідає кодуванню ключа aRemovedView."


Дякую! Це зафіксувало це для мене. У мене давно виникає ця проблема, і я не знав, як її виправити, окрім як починати з нуля. Це було воно, видалили IBOutlets з контролера перегляду, але не знали, що вони все ще посилаються / пов’язуються у власнику (в даному випадку "Переглянути контролер" в програмі інтерфейсу - 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 вирішило проблему.


Так, не можу повірити, як часто я роблю цю помилку. Дякую лол
Бенджамін

31
  1. Вам потрібно вказати лише IBOutletодин раз, IBOutletмітка вашого ivar непотрібна.
  2. Чи використовуєте Ви власний обліковий запис за допомогою NIB UIViewController? У якийсь момент вам слід дзвонити[SecondView initWithNibName:@"yourNibName" bundle:nil];

Це допомогло! Я отримував помилку відповідності кодування ключових значень щодо властивості від іншого контролера перегляду. Виявляється, я дзвонив -initWithNibNameіз неправильним ім'ям ручки.
jlstrecker

Так, це теж мені допомогло .. Я використовував UIViewController замість MyCustomeViewController .. але це така проблема з ієрархією, можливо, .. самоаналіз не вдався через пропущений об’єкт класу .. Дякую в будь-якому випадку
Futur

У мене було подібне питання. Два однакових записи МБА випадково. Не відображався в коді, лише правою кнопкою миші UIControl (UIStepper у моєму випадку). Просто видалення одного виправлено.
Дейв Хаббард

30

Це сталося зі мною лише під час налагодження на пристрої (iPhone). Симулятор iOS працював нормально. Зробити "Product-> Clean" з Xcode здавалося, що це вирішило проблему, але я не маю поняття, чому.


Це вирішує мою проблему. tsk2x майже 3 дні головного болю.
користувач3818576

5
Це дійсно дає відповідь на питання. Щось заплуталося в Nib і чисте вирішення це вирішило. Я прочитав і спробував усе вищесказане безрезультатно, а потім чистив, і через 1 годину спроби виправити це рішення Майя виправило це. Мені б хотілося побачити, що в XML могло спричинити це, але я продовжував.
LevinsonTechnologies

Це дійсно вирішує проблему - я спробував численні пропозиції вище, і лише проект чистий виправив цю помилку, яка раптово почала виникати. Ugg ...
DustinB

Це вирішило мою проблему, я спробував багато вищезазначених пропозицій. Здається дивно!
Naveen Shan

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

"Я неправильно зробив це ..." спасибі, це не перший раз, коли я витрачаю багато через цю справді дурну помилку
tontonCD

23

Це може виходити з того, що ви перетягували та створювали розетку чи дію та забули її видалити. Навіть якщо ви видалили код або навіть якщо ви зробили достатньо cmd + Z, вам потрібно буде зайти в інспектор підключення вашої розгортки та побачити, чи створені вами дії чи розетки все ще тут чи ні.


Дякую! Я n00b на Xcode і зайняв деякий час, щоб знайти зловмисні посилання. У Xcode 9.2 ви можете клацнути правою кнопкою миші елемент на панелі перегляду та встановити прапорець "Референтні місця".
kunigami

21

Переглядаючи інші відповіді, схоже, існує багато речей, які можуть спричинити цю помилку. Ось ще один.

Якщо ви

  • мати спеціальний перегляд
  • додано властивість @IBInspectable
  • а потім її видалили

Тоді ви також можете отримати помилку, схожу на

Не вдалося встановити (xxx) визначене користувачем перевірене властивість у [Your Custom View] ...: цей клас не є ключовим значенням, що відповідає кодуванню для ключа [xxx].

Рішення - видалити стару властивість.

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

Відкрийте інспектор посвідчення особи для свого класу, виберіть ім'я властивості у розділі "Атрибути часу виконання", визначені користувачем, і натисніть кнопку мінус (-).


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

15

Це трапляється зі мною, коли мій контролер перегляду спочатку мав файл .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];
}

12

Властивість "модуля" контролера перегляду в інспектора ідентичності може відрізнятися від того, що ви очікували. Також переконайтеся, що нові класи додаються до вашого цільового списку.


голосування, оскільки це було в моєму випадку. Я використовую Swift та Storyboards. Коли я створив нову ціль збірки (щоб створити варіант збірки), додаток не працював у новому варіанті, тоді як перший працював ОК. Додаток зазнав аварії на контролері перегляду, де ім'я модуля якось було встановлено на модуль з першої цілі, тоді як у робочих контролерах View це було Current - <назва модуля тут> . У цьому випадку вам потрібно стерти ім'я модуля.
Міксаз

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випадок заяви переключення дійсно спрацював String?.

Нарешті я зрозумів, що ви не можете використовувати необов'язкові типи швидкого доступу, setValue:forKeyякщо вони не мають прямого відображення на тип Objective-C, як String?або NSNumber?. Я змінив усі CShort?типи, NSNumber?оскільки це має пряме відображення. Бо Bool?в моєму випадку мені було чудово просто використовувати Boolта ініціалізувати false. Інші, можливо, не мають такої розкоші.

У будь-якому разі, який головний біль, який так сподівався, допомагає комусь, хто має подібну проблему, і постійно переспрямовується на це питання і каже собі: "Я нічого не роблю в інтерфейсі !!".

Отже, нарешті, повторити ще раз, що кодування Key-Value не працює з додатковими параметрами. Нижче я десь знайшов, але забуваю, де так, хто, хто це опублікував, прошу вибачення і, якщо б я згадав, де це знайшов, але це врятувало моє життя:

Ви не можете використовувати KVC для необов'язкової властивості Int, оскільки KVC - Cocoa / Objective-C, а Objective-C не може бачити необов'язковий Int - він не пов'язаний з Objective-C. Objective-C може бачити лише типи, які з'єднані з Objective-C:

типи класів, які походять від NSObject

типи класів, які піддаються дії @objc

Швидкі споруди, які є мостовими


1
Якщо ви намагаєтесь з'єднати значення булінгу Swift за допомогою прив'язки какао, вам потрібно викрити його директивою @objc; інакше ви дійсно отримаєте цю помилку. Це має бути найкращою відповіддю.
jvarela

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, який ви перейменували або видалили. Перенаправлення працює для мене.


8

У мене щойно виникло це питання в моєму дублірованому проекті і вирішено, перевіривши 2 місця:

1- Переконайтеся, що у списку є файл .m -> Проект - Фази збирання - Компілюйте джерела
2- Після цього перейдіть до конструктора інтерфейсів (можливо, це помилка виникає лише з ІБ) і від'єднайте всі властивості, мітки, зображення і т. д. ... Потім перев’яжіть усі. Я зрозумів, що я видалив атрибут, але він все ще був пов'язаний у IB.

Сподіваюсь, це спрацює для деяких.


7

Ще одне "невідповідне" питання, яке я знайшов, - коли мені вдалося з двох причин отримати два екземпляри класу.

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

Щоб дізнатися, яка була "правильна" копія, я використовував cmd-клавішу XCode на ім'я класу в іншому місці, щоб перейти до потрібної копії, тоді я вибив з себе невірні невикористані копії (після того, як спочатку надсилав свої зміни з не використовуваної копії).

Мораль історії: копії файлів класу погані.


7

Ця помилка - це щось інше!

Ось як я виправив це. Я використовую xcode версії 6.1.1 і використовую swift. Я отримував цю помилку щоразу, коли моє додаток намагалося здійснити спробу переходу на наступний екран. Ось що я зробив.

  1. Перевірив, що кнопка підключена до правильної дії. (Це не проблема, але все-таки добре перевірити)
  2. Переконайтеся, що на кнопці немає додаткових дій чи розеток, які ви могли створити помилково. (Це не проблема, але все-таки добре перевірити)
  3. Перевірте журнали та переконайтеся, що всі кнопки у НАСТУПНОМУ ЕКРАНІ мають правильні дії, а якщо є якісь виразки, переконайтесь, що вони мають унікальний ідентифікатор. (У цьому і була проблема)
    • В одному з сегів не було унікального ідентифікатора
    • Один з кнопок мав дію та дві розетки, які я створив помилково.
    • Видаліть будь-які додаткові торгові точки та переконайтесь, що ви на наступному екрані мають унікальні ідентифікатори.

Ура,


6

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

Щоб виправити це:

  1. Виділіть .m файл.
  2. На правій панелі виберіть «Інспектор файлів».
  3. У розділі "Цільове членство" переконайтеся, що встановлено відповідну ціль збірки.

Сподіваюся, це допомагає комусь там.


6

Якщо у вас є спеціальний підклас UIViewController з IBOutlets, який викликає проблеми, єдиним набором кроків, за якими я виявив, щоб фактично позбутися помилки, були

.1 Змініть клас на UIViewController

.2 Відключіть усі розетки (зараз у них буде жовтий трикутник попередження) - можливо, буде достатньо просто відключити проблемні розетки.

.3 Виконайте всі стандартні кроки - ↑ ⌘K, видаліть отримані дані (, килимки для молитви, хвилюйтеся намистинами)

.4 Запустіть додаток - перейдіть до проблемної сцени.

.5 Вбийте додаток, поверніться до Інтерфейсу Builder, щоб змінити клас назад до вашого власного класу.

.6 Підключіть свої торгові точки.

Запустіть додаток, і це, як правило, усуне проблеми дотримання ключових значень.


Це спрацювало під час копіювання та вставлення сцени в редактор Storyboard.
Мізмор

5

У моєму випадку. Після об’єднання у мене не було відсутніх розеток у xib-файлах.

Shift + Command + K

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


4

У моєму випадку це було викликано посиланням на неправильний Nib:

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

1
Зі мною трапляється, коли я перейменую клас контролера перегляду та забуваю, що ім'я ручки теж потрібно змінити. Оскільки прізвище - це лише рядок, помилки компілятора немає.
kris

3

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


Я знову отримав цю помилку. Цього разу я створив новий контролер порожнього перегляду таблиці з присвоєним йому класом, залишивши непрацюючого в спокої, і перемістив на нього segue. Це спрацювало. Потім я повільно копіював кожен елемент у вікні, доки він знову не вийшов з ладу. Цього разу проблема виявилася у тому, що я призначив вибраним атрибутам часу виконання вибраний користувачем (я думав, що можу використовувати їх для ініціалізації вибору, тому мені не доведеться робити це в коді, не маючи уявлення, чи це можливо ). Видалення, що вирішило проблему. Ця помилка дійсно жахлива, сподіваюся, вона буде покращена в майбутньому випуску!
Симетричний

3

У мене така ж проблема. Я зробив скидання тренажера. Видалення та додавання кнопок управління. і нарешті прибрали. :) Завдяки переповненню стека. Деякі, як мій код став нормальним і почав працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.