it-swarm.com.ru

Что это значит? «NSUnknownKeyException, причина:… этот класс не соответствует значению ключа, кодирующему ключ X»

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

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

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

1099
Guillaume Dubois

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

Я скачал твой проект.

Вы получаете ошибку

NSUnknownKeyException, причина: '[<UIViewController 0x3927310> setValue: forUndefinedKey:]: этот класс не соответствует значению ключа, соответствующему кодировке для строки ключа.'

Это вызвано тем, что контроллер представления Second в MainWindow.xib имеет класс UIViewController ВМЕСТО SecondView. Переход на правильный класс решает проблему.

Кстати, это плохая практика - иметь такие имена, как "строка" в Objective-C. Это вызывает столкновение именования во время выполнения. Избегайте их даже в разовых тренировочных приложениях. Названия коллизий могут быть очень трудно отследить, и вы не хотите тратить время.

Другая возможная причина этой ошибки: при копировании и вставке элементов из одного контроллера в другой, Xcode каким-то образом сохраняет эту ссылку на исходный контроллер, даже после редактирования и повторной привязки этого элемента в новый контроллер.

Другая возможная причина этой ошибки:

Bad Outlet.

Вы удалили или переименовали имя выхода в файле .h.

Удалите его в инспекторе соединений файла .xib или .storyboard.

911
TechZen

У вас может быть плохая связь в вашей XIB.

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

Из твоего пера:

  1. Выберите объект в IB и перейдите в "Инспектор соединений".
  2. В разделе "Ссылочные выходы" убедитесь, что ваш объект по-прежнему не связан со старым именем свойства ... если это так, щелкните маленькую "x", чтобы удалить ссылку и построить снова.

    example 1

Еще одна распространенная причина, если вы используете раскадровку, ваша UIButton может иметь более одного назначения (решение почти такое же, как для nib):

  1. Откройте раскадровку и щелкните правой кнопкой мыши на кнопке UIB
  2. Вы увидите, что этой кнопке назначено несколько ссылок/ссылок. Удалите одно из серых окон "Main ..." с маленькой буквой "x":

    example 2

1480
nuttysimple

Мне пришлось удалить приложение из симулятора/iPhone, чтобы избавиться от этой ошибки.

110
Steve Rogers

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

Удалите соединения на изображении ниже. Delete the connections in inspector when File Owner is highlighted

Просто убедитесь, что у вас есть только соединения с ячейкой табличного представления. Чтобы проверить, нажмите на ячейку табличного представления и в INSPECTOR ищите свои соединения.

The connection should be in here when Table View Cell is highlighted

100
uplearnedu.com

Иногда это связано с вашим "Наследовать от цели". Это значение должно быть установлено. В приложениях с одной целью вы можете просто выбрать Inherit From Target. Если у вас более одной цели, выберите нужную цель.

enter image description here

81
mrabins

Если это приложение только для iPhone, а не универсальное, убедитесь, что следующее поле не заполнено:

Цели> Сводка> Информация о развертывании iPhone/iPod> Главный интерфейс

Если вы укажете XIB там, он падает.

64
erkanyildiz

Эта ошибка означает, что уже подключенный Интерфейсный Разработчик объект удален/переименован в источнике его владельца (Владелец файла).

Удерживая клавишу Control, щелкните Владелец файлов в Интерфейсном Разработчике, если вы видите восклицательный знак, вам необходимо это исправить.

На рисунке ниже вы можете видеть, что "aRemovedView" имеет восклицательный знак справа, потому что я удалил объект представления IBOutlet, когда он уже был подключен в IB.

enter image description here

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

60
Tibidabo

У меня была та же проблема, и, хотя ответ TechZen действительно может быть удивительным, мне было трудно применить к моей ситуации.

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

Надеюсь это поможет.

enter image description here

41
Eric Brotto

в моем случае это была ошибка в исходном коде раскадровки, выполните следующие действия:

  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 макета раскадровки;)

36
Fareed Alnamrouti

enter image description hereenter image description here

Мое исправление было похоже на исправление Джерарда Гранди. При создании пользовательского UITableViewCell с использованием XIB я по ошибке применил имя пользовательского класса к владельцу файла, а не к UITableViewCell. Применение класса к UITableViewCell на холсте и подключение к нему моих свойств IBOutlet решило проблему.

32
ashack
  1. Вам нужно только указать IBOutlet один раз, метка IBOutlet для вашего ivar не нужна.
  2. Вы создаете экземпляр своего NIB, используя свое UIViewController? В какой-то момент вы должны звонить [SecondView initWithNibName:@"yourNibName" bundle:nil];
30
kubi

Это происходило со мной только при отладке на устройстве (iPhone). Симулятор iOS работал нормально. Казалось, что решение "Product-> Clean" из Xcode решило проблему, но я понятия не имею, почему.

30
Maj

Это может происходить из-за того, что вы перетаскивали элемент управления и создали розетку или действие и забыли удалить его. Даже если вы удалили код или даже сделали достаточно cmd + Z, вам нужно будет зайти в инспектор соединений вашей раскадровки и посмотреть, все ли созданное вами действие или розетка все еще здесь или нет.

23
Ilansky Naftali

У меня было точно такое же сообщение об ошибке, и спасибо (!!) Кире от 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 (?!?) Часа прямо сейчас, чтобы найти ответ на это сообщение об ошибке. , Если бы я мог сэкономить это одному или двум людям, это было бы здорово :)

PS: Для тех, кто интересуется продолжением кода для загрузки другого UIViewController:

    [self presentViewController:deviceViewController animated:YES completion:nil];
22
Yannis

Просматривая другие ответы, кажется, что есть много вещей, которые могут вызвать эту ошибку. Вот еще один.

Если ты

  • иметь собственный вид
  • добавил свойство @IBInspectable
  • а потом позже удалил его

Тогда вы также можете получить ошибку, аналогичную

Не удалось установить (xxx) проверенное пользователем определенное свойство в [Ваше пользовательское представление] ...: этот класс не соответствует значению ключа для кода [xxx].

Решение состоит в том, чтобы удалить старое свойство.

enter image description here

Откройте инспектор идентификации для вашего класса, выберите имя свойства в разделе "Определенные пользователем атрибуты времени выполнения" и нажмите кнопку "минус" (-).

20
Suragch

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

Хотя я удалил файл .xib из этого проекта. Пользователи iPhone/iPad могут содержать файлы .xib для этого viewcontroller.

Попытка загрузить файл .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];
}
15
neoneye

Свойство "Модуль" View Controller в Identity Inspector может отличаться от ожидаемого. Также убедитесь, что новые классы добавлены в ваш целевой список.

12
ercu

У меня была похожая проблема для проекта, который имеет две цели (со своим собственным MainWindow XIB). Основная проблема, которая вызвала у меня эту ошибку, заключалась в том, что класс UIViewController не был включен в список ресурсов второго проекта. То есть конструктор интерфейса позволил мне указать его в MainWindow.xib, но во время выполнения система не смогла найти класс.

То есть cmd-клик по рассматриваемому классу UIViewController и дважды проверьте, что он включен на вкладке "Цели".

10
David Carney

Это может быть в случае ссылки на компонент из интерфейса Xib, который вы переименовали или удалили. Повторная ссылка работает для меня.

8
MehrozKarim

Я только что столкнулся с этой проблемой в моем дублированном проекте и решил, проверив 2 места:

1- Убедитесь, что у вас есть файл .m в списке -> Проект - Фазы сборки - Исходники компиляции
2- После этого перейдите к конструктору интерфейсов (возможно, это ошибка только с IB) и отмените привязку всех свойств, меток, изображений и т.д. Затем снова свяжите все. Я понял, что удалил атрибут, но он все еще был связан в IB.

Надеюсь, что это работает для некоторых.

8
kubilay

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

Я работал над кодированием веб-службы в Swift 2. Я создал все необходимые прокси-объекты и заглушки. Проходя по возвращенному XML, я динамически создавал экземпляры своих объектов, которые все были получены из NSObject и использовали setValue:forKey на них. Каждый раз, когда setValue:forKey пытался установить свойство, оно взрывалось с этой ошибкой.

У меня был оператор switch для каждого типа, с которым я имел дело (например, Bool?, CShort?, String?), и для каждого узла XML я проходил и проверял, какой тип был у объекта, а затем преобразовывал значение в этот тип и пытался установить его с setValue:forKey.

В конце концов я начал комментировать все эти строки setValue:forKey и обнаружил, что мой случай оператора переключения default сработал для String?.

Я наконец-то понял, что вы не можете использовать необязательные типы Swift с setValue:forKey, если только у них нет прямого сопоставления с типом Objective C, таким как String? или NSNumber?. В итоге я изменил все типы CShort? на NSNumber?, так как это имеет прямое отображение. Для Bool? в моем случае для меня было нормальным просто использовать Bool и инициализировать его как false. Другие могут не иметь такой роскоши.

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

Итак, наконец, еще раз повторить, что Key-Value Coding не работает с опциями. Ниже я в конечном итоге нашел где-то, но я забыл, где так, чтобы кто бы ни опубликовал это, я извиняюсь и воздаю должное, если бы я вспомнил, где я нашел это, но это спасло мою жизнь:

Вы не можете использовать KVC для необязательного свойства Int, поскольку KVC - это Какао/Objective-C, а Objective-C не может видеть необязательный Int - он не соединен с Objective-C. Objective-C может видеть только типы, которые связаны с Objective-C:

типы классов, производные от NSObject

типы классов, предоставляемые с помощью @objc

Быстрые структуры, которые соединены

8
AtheistP3ace

Эта ошибка - что-то еще!

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

  1. Проверено, что кнопка была подключена к правильному действию (это не было проблемой, но все еще хорошо проверить)
  2. Убедитесь, что у кнопки нет никаких дополнительных действий или выходов, которые вы, возможно, создали по ошибке. (Это не было проблемой, но все же хорошо проверить)
  3. Проверьте журналы и убедитесь, что все кнопки на СЛЕДУЮЩЕМ ЭКРАНЕ имеют правильные действия, и если есть какие-либо переходы, убедитесь, что у них есть уникальный идентификатор. (Это была проблема)
    • Один из сегментов не имел уникального идентификатора
    • У одной из кнопок было действие и два выхода, которые я создал по ошибке.
    • Удалите все дополнительные выходы и убедитесь, что переходы к следующему экрану имеют уникальные идентификаторы.

Ура,

7
Ronaldoh1

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

Неправильный способ подтолкнуть контроллер

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];

Я не нашел ни одного ответа, как указано выше, поэтому может быть, он может помочь кому-то, имеющему ту же проблему

7
Emy Stats

Еще одна проблема "не соответствует", которую я обнаружил, когда по какой-то причине мне удалось получить две копии класса.

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

Чтобы найти "правильную" копию, я использовал cmd-щелчок XCode по имени класса в другом месте, чтобы перейти к правильной копии, а затем уничтожил неиспользуемые копии (после того, как сначала перенес мои правки из неиспользованной копии).

Мораль истории: дубликаты файлов классов плохие.

7
Jason

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

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

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

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

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

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

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

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

6
Damo

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

Чтобы исправить это:

  1. Выделите ваш .m файл.
  2. На правой панели выберите инспектора файлов.
  3. В разделе "Целевое членство" убедитесь, что выбран соответствующий целевой объект сборки.

Надеюсь, это поможет кому-то там.

6
Mike M. Lin

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

Shift + Command + K

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

5
Malder

В моем случае это было вызвано неправильной ссылкой на Nib:

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

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

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

3
pedrotorres

У меня та же проблема. Я сделал сброс симулятора. Снятие и добавление кнопки управления. и наконец сделал чистку. :) Благодаря переполнению стека. Некоторые, как мой код стал нормальным и начал работать.

3
priya

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

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

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

3
Avinash Jadhav

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

3
Symmetric

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

2
Jorge Rodrigues dos Santos

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

2
Jyotsna

Я удалил свойство из заголовочного файла. Я не мог найти ссылку на него, но ошибка отладки все еще ссылалась на него. Я обнаружил, что в 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

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

2
IsPha

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

2
sysuser

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

@property (strong, nonatomic) IBOutlet UIView *someView

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

1
Fonix

В моем случае,

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

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

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

1
Deve Tester

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

1
IanS

Я решил эту проблему, выполнив 2 действия:

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

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

1
Bogdan Kobylynskyi

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

1
zakhej

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

[array valueForKeyPath:@"distinctUnionOfObjects.self"]

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

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

1
CommaToast

Это уже случалось со мной дважды.

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

1
Rafael Ruiz Muñoz

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

1
Chris Allinson

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

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

enter image description here

1
Honey

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

1
steepLearningCurve

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

1
IanS

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

@objc (XXXViewController) класс XXXViewController

1
user1760527

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

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

1
Roman Reimche

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

@objc(MyViewController) class MyViewController
1
user1760527

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

0
JackieLam

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

lOL 54 ответов, и ни один из них не является моим решением. Поговорим об общей ошибке.

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

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

0
tem

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

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

0
Ahmed Elashker

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

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

0
sgvd

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

0
Olle Raab

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

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

0
Wes

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

@implementation MySubclass
@end
0
Iulian Onofrei

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

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

Например, вы решили изменить имя файла XIB, а затем забыли изменить имя, используемое в методе initWithNibName, на то же имя.

0
Li Fumin

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

0
jatin

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

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

0
Rickster

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

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

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

0
MBH

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

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

_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
Heider Sati

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

Если вы покажете это так:

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

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

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

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

0
Eric

Еще один сложный случай:

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

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

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

0
Vladimir Borodko