Что это значит? «NSUnknownKeyException, причина:… этот класс не соответствует значению ключа, кодирующему ключ X» - PullRequest
1109 голосов
/ 21 июня 2010

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

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

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

Ответы [ 66 ]

1 голос
/ 17 мая 2016

Это произошло, когда я связал UIView с раскадровкой и подключил IBOutlet, например:

@property (strong, nonatomic) IBOutlet UIView *someView

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

1 голос
/ 31 марта 2016

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

enter image description here

0 голосов
/ 13 марта 2017

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

@implementation MySubclass
@end
0 голосов
/ 01 декабря 2016

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

0 голосов
/ 14 октября 2016

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

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

0 голосов
/ 16 сентября 2015

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

0 голосов
/ 21 ноября 2013

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

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

0 голосов
/ 25 августа 2013

Я помню, как у меня была похожая проблема в прошлом, я решил ее, изменив строку:

_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 для initМой _vicMain, после использования всплывающего окна сверху, я понял, что оба используют один и тот же UIViewController.

By:

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

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

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

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

С уважением, Хайдер Сати

0 голосов
/ 25 августа 2012

Обычно, когда это происходит со мной, ответ @ 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 голосов
/ 23 октября 2013

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

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

...