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

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

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

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

863
задан Guillaume Dubois 21 июня '10 в 22:57
источник поделиться

63 ответов

  • 1
  • 2
  • 3

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

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

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

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

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

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

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

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

3
ответ дан Damo 07 июля '16 в 16:38
источник поделиться

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

Shift + Command + K

решил мою проблему. Я очистил проект и перестроил его.

2
ответ дан Malder 02 окт. '15 в 12:12
источник поделиться

Я удалил свойство из файла заголовка. Я не мог найти ссылки на него, но ошибка отладки все еще ссылалась на него. Я обнаружил, что в файле 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
ответ дан Apple Pirate 17 апр. '13 в 20:58
источник поделиться

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

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

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

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

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

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

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

2
ответ дан Jorge Rodrigues dos Santos 23 янв. '13 в 2:58
источник поделиться

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

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

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

@property (strong, nonatomic) IBOutlet UIView *someView

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

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

В моем случае

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

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

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

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

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

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

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

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

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

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

@objc (XXXViewController) класс XXXViewController

1
ответ дан user1760527 27 сент. '15 в 8:47
источник поделиться

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

[array valueForKeyPath:@"distinctUnionOfObjects.self"]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0
ответ дан JackieLam 04 сент. '13 в 9:28
источник поделиться

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

Обычно, когда это происходит со мной, ответ @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
ответ дан clozach 25 авг. '12 в 19:44
источник поделиться

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

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

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

0
ответ дан Li Fumin 22 авг. '13 в 11:31
источник поделиться

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

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

0
ответ дан sgvd 23 окт. '13 в 15:00
источник поделиться

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

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

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

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

0
ответ дан Olle Raab 01 дек. '16 в 1:30
источник поделиться

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

0
ответ дан jatin 16 сент. '15 в 15:52
источник поделиться

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

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

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

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

0
ответ дан Vladimir Borodko 24 сент. '15 в 19:56
источник поделиться

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

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

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

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

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

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

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

0
ответ дан Ahmed Elashker 14 окт. '16 в 2:52
источник поделиться

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

0
ответ дан Chris Allinson 07 февр. '17 в 1:57
источник поделиться
  • 1
  • 2
  • 3

Другие вопросы по меткам