Что это значит? "NSUnknownKeyException", причина:... этот класс не является ключевым значением, совместимым с кодировкой для ключа X "

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

Мое приложение разбивается со следующей ошибкой. Что это значит? Как я могу это исправить?

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

1049
задан 21 июня '10 в 22:57
источник поделиться
66 ответов
  • 1
  • 2
  • 3

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

3
ответ дан 28 окт. '11 в 6:10
источник

У меня была такая же проблема. Я создал tableviewCell в XIB файле и получал такую ​​ошибку. Моя проблема заключалась в том, что я определил класс "Владелец файла" как мой контроллер ячеек. Я просто взял его и установил класс ячейки (в файле xib щелкните по границе ячейки, перейдите на третью вкладку на правой панели и где он говорит, что класс выбрал ваш контроллер представления).

Также попробуйте очистить свой код.

3
ответ дан 10 сент. '12 в 12:38
источник

Это также происходит со мной, когда на этикетке пользовательского интерфейса или другом элементе пользовательского интерфейса ссылаются две переменные в классе контроллера представления, и я удаляю одну из переменных.

2
ответ дан 05 июля '15 в 0:41
источник

У меня была такая же проблема. Это случилось с моим проектом, потому что я изменил имя своего продукта, но в построителе интерфейса у меня было старое имя как Module, это приводит к сбою, поэтому обязательно проверьте, что все имя модуля xib также было изменено или нет.

2
ответ дан 23 февр. '16 в 8:25
источник

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

В Навигаторе проектов

Найдите файл Nib (xib). Щелкните правой кнопкой мыши и выберите "Источник". Я удалил следующий полный раздел

<object class="IBConnectionRecord">
    <object class="IBCocoaTouchOutletConnection" key="connection">
        <string key="label">DeleteLabel</string>
        <reference key="source" ref="372490531"/>
        <reference key="destination" ref="774585933"/>
    </object>
    <int key="connectionID">20</int>
</object>
2
ответ дан 17 апр. '13 в 20:58
источник

Вам может потребоваться удалить розетку, воссоздать ее, вычерчивая форму IB в файл .H.

2
ответ дан 03 июля '16 в 23:10
источник

Проверьте, нет ли у вас блуждающих реферирующих выходов, выбирая оскорбительный объект в интерфейсе Storyboard/xib и открывая инспектор подключений (View- > Utilities- > Show Connections Inspector). Если вы удалите ненужные соединения, и вам должно быть хорошо идти.

2
ответ дан 23 янв. '13 в 2:58
источник

Другая причина этой ситуации заключается в том, что вы объявляете это свойство, реализованное как @dynamic, но класс не может найти его в родительском классе.

1
ответ дан 23 нояб. '12 в 14:54
источник

В моем случае

[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]

была причиной.

заменив это initWithNibName, разрешен.

1
ответ дан 14 апр. '14 в 9:09
источник

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

В этом нет никаких проблем. Вам нужно только добавить точку входа в раскадровку, т.е. Проверить is initial View Controller, на которой когда-либо просматривался ваш контроллер. В противном случае это будет серая сцена и выдаст вам ошибку.

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

1
ответ дан 31 марта '16 в 21:49
источник

Это уже произошло со мной дважды.

Решение переделало всю раскадровку, так как я скопировал ее из другого (потому что это было почти то же самое)

1
ответ дан 27 июня '15 в 14:56
источник

У меня была эта проблема с быстрыми классами после обновления до xcode7. Решил его с помощью директивы @objc:

@objc (XXXViewController) класс XXXViewController

1
ответ дан 27 сент. '15 в 8:47
источник

У меня это было, когда у меня был UIView, связанный с раскадрой и связанный с ним IBOutlet:

@property (strong, nonatomic) IBOutlet UIView *someView

но позже я сделал UIView в пользовательский класс, но забыл изменить имя класса этого IBOutlet, определенного выше. его странная ошибка, потому что, если у пользовательского представления нет подзаголовков, он не жалуется, но, как только есть subviews, он показывает ошибку, указанную в вопросе, но на одном из подзонов, а не на внешнем UIView, где проблема действительно существует. если бы я удалял и считывал все подпункты, пытаясь найти проблему, когда на самом деле не имело никакого отношения к subviews

1
ответ дан 17 мая '16 в 9:15
источник

Представлена ​​одна и та же проблема. Мое решение состояло в том, чтобы выровнять правильную раскадровку в Главной раскадровке. Я переименовал mainstoryboard.storyboard, но не reset информацию о развертывании.

1
ответ дан 02 нояб. '12 в 21:05
источник

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

1
ответ дан 20 июня '16 в 16:04
источник

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

1
ответ дан 20 июня '16 в 16:08
источник

У меня была такая же проблема, и причина была связана с определением модуля в построителе интерфейса (в отличие от оставления его пустым). Итак, когда я использовал другой модуль, чем тот, который я установил, приложение будет разбиваться: S... надеюсь, что это помогает кому-то другому, поскольку моя проблема не была из-за неисправности или устаревшей розетки!

1
ответ дан 07 февр. '17 в 1:57
источник

Это может означать, что вы пытаетесь использовать дескриптор сортировки без аскиса в начале. Как в:

[array valueForKeyPath:@"distinctUnionOfObjects.self"]

На самом деле это должно быть:

[array valueForKeyPath:@"@distinctUnionOfObjects.self"]

1
ответ дан 21 июня '16 в 0:50
источник

У меня была эта проблема с раскадрой и быстрым классом для контроллера ui view. Решил его с помощью директивы @objc:

@objc(MyViewController) class MyViewController
1
ответ дан 04 апр. '17 в 15:08
источник

В моем случае имя свойства IBOutlet в ViewController.m было изменено, а в Storyboard - нет. Повторное введение IBOutlet в ViewController.m с помощью Ctrl-drag решило проблему. Я также заметил способ найти такие "сиротские" IBOutlets в XCode: (посмотрите на изображение) те, которые не "осиротели", имеют концентрические круги вместо номеров строк.

"Orphaned" IBOutlets don't have concentric circles in the line number column.

1
ответ дан 18 июня '18 в 8:06
источник

Иногда быстрый файл не добавляется и не удаляется из цели, перейдите в цель → Настройка сборки → скомпилировать Источники → посмотреть, отсутствует ли какой-либо требуемый файл быстрого файла или нет. В моем случае приложение зависало из-за быстрого исходного файла, отсутствующего в компиляции.

0
ответ дан 16 сент. '15 в 15:52
источник

Другой сложный случай:

В IB добавлен ViewController в раскадровку, удалено его представление и задано значение Custom Class для "MyViewController", поэтому представление создается из MyViewController.xib

Задание идентификатора раскадровки того же "MyViewController" вызывает исключение.

Изменение идентификатора раскадровки на другое имя разрешает проблему.

0
ответ дан 24 сент. '15 в 19:56
источник

Убедитесь, что в файле .m добавлена ​​реализация пользовательского класса (даже пустой), например:

@implementation MySubclass
@end
0
ответ дан 13 марта '17 в 18:41
источник

Эта проблема также возникает, если вы хотите создать небольшое подвью в отдельном файле XIB в Interface Builder, а в IB вы установите его в тот же класс, что и родительский.

Если вы затем покажете это следующим образом:

UIViewController *vc = [[UIViewController alloc] initWithNibName:@"NameOfTheSubviewNibFile" bundle:nil];
[self.view addSubview:vc.view];

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

  • В коде родительского представления объявите IBOutlet UIView *mySubview ссылку на представление в файле subview nib
  • В файле subview nib подключите владельца файла к представлению и установите его в mySubview
  • показать это, выполнив:
[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]
[self.view addSubview:mySubview];

и все будет хорошо!

0
ответ дан 19 дек. '12 в 7:04
источник

Я нашел еще одну возможность, которая может вызвать проблему.

При использовании метода "initWithNibName" с неправильным именем xib это также приведет к подобному сбою.

Например, вы хотите изменить имя файла xib, а затем foget, чтобы изменить имя, используемое в методе "initWithNibName", с тем же именем.

0
ответ дан 22 авг. '13 в 11:31
источник

Помню, что у меня была аналогичная проблема в прошлом, я решил ее, изменив строку:

_vicMain = [[UIViewController alloc] initWithNibName:@"vicMainScreen" bundle:nil];

в

#include "vicLogin_iPad.h"       // This is the H file of the class holding the code for
                                 // processing all the IBOUtlets for the Login screen
.
.
.

_vicMain = [[vicLogin_iPad alloc] initWithNibName:@"vicMainScreen" bundle:nil];

Обратите внимание, что я изначально объявлял UIViewController инициализировать мой _vicMain, после того, как всплывающее окно сверху, я понял, что оба используют один и тот же UIViewController.

По:

1) ВКЛЮЧАЯ ваш класс (подзаголовка) вместе с тем же модулем, который выполняет вышеуказанный _vicMain (который является объектом/переменной контроллера представления), то есть он "vicLogin_iPad.h" в моем случае, и:

2) Используйте свой пользовательский конструктор для объявления объекта (т.е. вместо "xxx = [UIViewController alloc] ...", вместо этого вы используете "xxx = [vicLogin_iPad alloc] ...".

проблема разрешена.

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

Отношения Хайдер Сати

0
ответ дан 25 авг. '13 в 14:44
источник

У меня была та же ошибка в еще одной немного другой форме:

В построителе интерфейса у меня есть контроллер навигации с настраиваемым субконтроллером. Имя этого класса было правильно настроено, однако имя NIB (выберите субконтроллер, перейдите в Attributes Inspector), был установлен неверный файл (в основном, для одной из разных целей). Сброс этого правильного имени файла решил проблему.

0
ответ дан 23 окт. '13 в 15:00
источник

У меня тоже была эта проблема. Я скопировал представление с IBOutlet из одного xib файла в другой файл xib. И хотя я удалил старую ссылку и создал новую ссылку, эта ошибка все еще возникала.

Я решил перезапустить xcode, чтобы исправить эту проблему.

0
ответ дан 21 нояб. '13 в 22:58
источник

Вы не оставили свой объект-подборщик не связанным?

lol 54 ответов, и ни одно из них не является моим решением. Расскажите об общей ошибке.

В моем случае это было потому, что у меня был объект выбора на моем VC и не устанавливал выход и действие для него.

Я часто оставляю кнопки и т.д., когда я просто смотрю, как выглядит макет. Но, похоже, вы не можете сделать это для сборщика.

0
ответ дан 08 авг. '16 в 11:29
источник

Причиной моей проблемы было то, что я дублировал файл раскадровки (вне Xcode, если я правильно помню), тогда все контроллеры представлений в дублированном файле имели тот же идентификатор объекта, что и в исходном файле. Средством защиты является копирование контроллеров представления, и они затем получат новый идентификатор объекта. Вы можете увидеть идентификатор объекта в Инспекторе идентификации.

0
ответ дан 01 дек. '16 в 1:30
источник
  • 1
  • 2
  • 3

Другие вопросы по меткам или Задайте вопрос