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

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

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

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

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

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

Благодарю.

+1109
21 июн. '10 в 19:57
источник поделиться
66 ответов
  • 1
  • 2
  • 3

У вас могут быть выходные элементы UI Element, но не свойство IBOutlet в файле .h Файл

Для всех элементов пользовательского интерфейса в атрибутах Connection Attribute и соответствующего свойства в файле заголовка .h.

Может отсутствовать одна или несколько записей свойств в файле .h.

+3
26 февр. '16 в 16:17
источник

Связанные вопросы


Похожие вопросы

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

+3
28 окт. '11 в 3:10
источник

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

+2
22 янв. '13 в 23:58
источник

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

+2
04 июл. '15 в 21:41
источник

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

+2
03 июл. '16 в 20:10
источник

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

+2
23 февр. '16 в 5: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 в 17:58
источник

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

+1
23 нояб. '12 в 11:54
источник

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

@property (strong, nonatomic) IBOutlet UIView *someView

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

+1
17 мая '16 в 6:15
источник

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

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

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

+1
31 мар. '16 в 18:49
источник

Я решил эту проблему, выполнив 2 вещи:

  1. Исправлена ссылка на класс просмотра:

pMnUn.jpg

  1. Повторно импортированы все магазины:

MhUjr.jpg

+1
27 янв. '19 в 5:50
источник

В моем случае имя свойства 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 в 5:06
источник

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

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

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

+1
06 февр. '17 в 22:57
источник

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

+1
20 июн. '16 в 13:08
источник

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

+1
20 июн. '16 в 13:04
источник

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

@objc (XXXViewController) класс XXXViewController

+1
27 сент. '15 в 5:47
источник

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

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

+1
27 июн. '15 в 11:56
источник

В моем случае

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

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

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

+1
14 апр. '14 в 6:09
источник

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

+1
02 нояб. '12 в 18:05
источник

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

[array valueForKeyPath:@"distinctUnionOfObjects.self"]

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

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

+1
20 июн. '16 в 21:50
источник

Моя проблема началась после того, как я изменил имя Target.

В моих собственных пользовательских классах интерфейса имя модуля было установлено на старое имя цели.

Я изменил имя цели на новый, и теперь он отлично работает.

+1
19 июл. '17 в 5:24
источник

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

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

В моем случае я добавил ViewController в раскадровку, но я не назначил ему Storyboard ID в конструкторе. Как только я дал ему удостоверение личности, это сработало.

используя Xamarin/Visual Studio 2015.

0
16 февр. '18 в 17:38
источник

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

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

Обычно, когда это происходит со мной, ответ @TechZen делает трюк. Вчера, однако, я смущающе долгое время трахался с подключением к раскадровке, чтобы обнаружить, что проблема была в моем коде.

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

@interface MyViewControllerSubclass : MyViewController

Затем я добавил частную собственность в MyViewControllerSubclass.m:

@interface MyViewController ()
@property (weak, nonatomic) IBOutlet UILabel *crashesApp;
@end

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

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

@interface MyViewControllerSubclass ()
@property (weak, nonatomic) IBOutlet UILabel *noMoreCrashing;
@end
0
25 авг. '12 в 16:44
источник

Эта проблема также возникает, если вы хотите создать небольшое подвью в отдельном файле 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 в 4:04
источник

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

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

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

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

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

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

_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 в 11:44
источник

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

Это произошло со мной просто, когда я наблюдал свойство "Текст" текстового поля, когда вместо этого я должен был наблюдать свойство "text".

0
13 окт. '16 в 23:52
источник
  • 1
  • 2
  • 3

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