Ошибка Xcode 6: неизвестный класс в файле Interface Builder

512

Я обновился до Xcode 6 beta 4, и теперь мое приложение постоянно вылетает с сообщением

Неизвестный класс X в файле Interface Builder.

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

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

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

  • 0
    Возможный дубликат stackoverflow.com/questions/3416269/…
  • 1
    @ ImreKelényi Вы правы. Это снова случилось со мной недавно после того, что вы только что описали.
Показать ещё 4 комментария
Теги:
xcode
uistoryboard
interface-builder
xcode6

48 ответов

1383
Лучший ответ

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

Чтобы устранить эту проблему, вам нужно выбрать каждый из ваших собственных объектов класса в Storyboard (включая любые пользовательские представления, даже сами пользовательские контроллеры представлений).

Затем, выбрав эти объекты, откройте инспектор идентификации и в разделе "Пользовательский класс" вы увидите параметр "Модуль". Щелкните внутри текстового поля Module и нажмите enter.

Что это! Текущий модуль для всех моих пользовательских объектов, должно быть, был некорректно установлен некорректно в Xcode 6 beta 4. Но визуального указания этого в инспекторе не было.

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

Вот изображение, чтобы сделать вещи более ясными: Изображение 1583

  • 66
    Для меня нажатие внутри «Модуль» и нажатие клавиши ввода не работало последовательно, но выбор поля «Класс» (и нажатие клавиши ввода) всегда выполнял свою работу.
  • 0
    Я получал эту ошибку, и это произошло потому, что я изменил имя своего приложения, поэтому все модули были неправильными.
Показать ещё 45 комментариев
97

Иногда Xcode пропустил customModule="AppName" customModuleProvider="target"

Чтобы исправить это, откройте раскадровку как исходный код и замените эту строку:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">

:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
 customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
  • 7
    На самом деле в моем случае мне пришлось удалить customModuleProvider , затем ошибка исчезла.
  • 3
    Гильермо, все еще происходит в Xcode на конец марта!
Показать ещё 10 комментариев
64

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

@objc(ForumTopicListViewController) class ForumTopicListViewController
  • 4
    Это исправило это для меня, у меня был @objc class X и смена на @objc(X) class X работала.
  • 7
    Работал. Проклинаю тебя XCode ...
Показать ещё 8 комментариев
50

Это сработало для меня..

Проверьте ваш скомпилированный источник, добавлен ли этот файл (например, ViewController.m) или нет, в моем случае файл ViewController не был добавлен, поэтому он дал мне ошибку.

Изображение 1584

  • 0
    @CarmenA Вы только когда-либо добавляете файлы .m к Compile Sources . Это действительно правильное (и единственное) решение для некоторых.
  • 0
    Я попробовал несколько других решений без удачи. Это добилось цели. По какой-то странной причине одной цели не хватало одного исходного файла, который мне подходил.
Показать ещё 1 комментарий
41

Это может произойти в любом Xcode выше 6.0. Это случилось со мной после переименования некоторых классов ViewController в проекте Swift (но, я думаю, это произойдет и с Obj-C). Вам просто нужно открыть конструктор интерфейса, перейдите в Identity Inspector ViewController, который переименовал его класс, выберите класс и нажмите Enter. Это переназначает переименованный класс на выбранный ViewController, а также reset Значение модуля, которое теряется после переименования класса.

Обновление для Xcode 8.1 (возможно, также 8.0):

Xcode 8.1 просто падает. Просто и досадно просто падает и ничего не печатает. Я преследовал эту катастрофу phantom в течение часа, чтобы узнать, что это было то же самое - неназначенный класс в IB. Если вы получаете несколько сбоев phantom, сначала дважды проверьте IB для непризнанных классов.

  • 0
    работал на Свифта.
  • 0
    Спасибо за это. похоже, что следуя вашему предложению, Xcode обновит модуль (под классом в IB) с None на Current. Я думаю, проблема в том, что простой ввод имени без нажатия Enter не может вызвать обновление модуля XCode.
Показать ещё 1 комментарий
32

Проект с несколькими целями

В моем случае я работаю над проектом с несколькими целевыми объектами, и проблема была "inherit from Target" была снята. Выбор "inherit from target" решил мою проблему

Изображение 1585

  • 0
    Спасибо за публикацию этого. Решил проблему, которую видел очень быстро.
  • 0
    У меня была похожая ситуация. (XCode 9.4.1) Я создал приложение для iOS под названием FilesTestA с пользовательским UIView под названием MxFileView (который состоял из MxFileView.swift и MxFileView.xib). Затем я добавил еще одну цель: виджет «Сегодня» («FilesTestAWidget»). Решение для использования MxFileView в виджете: (1) class = "MxFileView"; (2) установите флажок «Inherit Module from Target» (или снимите флажок и введите вручную «FilesTestAWidget»); (3) в целевом приложении убедитесь, что и MxFileView.swift, и MxFileView.xib включают FilesTestAWidget в свое целевое членство.
Показать ещё 1 комментарий
31

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

  • 0
    Это было проблемой и для меня - множественные цели приводят к тому, что файл класса случайно не включается в цель, которую я строил.
  • 0
    Я слил файлы и пропустил это в одной из моих целей, отличный ответ
Показать ещё 2 комментария
26

Мой ответ: установите пользовательский модуль равным настраиваемому имени Pod (в моем примере - имя пользовательского класса), например, на скриншоте, прилагаемом

Это решение предназначено для конкретного случая: для пользовательских представлений классов из Pod (или Карфаген).,

Инфраструктура: XCode8, Swift3

Изображение 1586

  • 0
    Это работает для случая CocoaPods, спасибо :)
  • 0
    Не работает на Карфаген в моем случае
15

Я исправил это, обратившись к тому, что предложил Чикабуз (спасибо, что указали это, хотя). В файле раскадровки найдите это:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">

и замените его на это:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" sceneMemberID="viewController">

Я не могу поверить, сколько часов я теряю, сталкиваясь с ошибками в компиляторе Swift и Xcode 6

13

Выбор подходящего Module для моего Custom Class я решил эту проблему.

Вот:

Изображение 1587

  • 0
    полезно, решил мою проблему. Спасибо
13

Я столкнулся с этой проблемой в Xcode 8, для ее устранения мне пришлось изменить раскадровку в текстовом редакторе.

В общем, найдите свой контроль и удалите customModule и customModuleProvider из объекта управления.

Сделал трюк для меня.

  • 0
    Хах! Хороший хак :)
9

Проверьте, имеет ли ваш класс право Целевое членство.

9

У меня была та же проблема.

В моем случае Xcode не добавлял мой пользовательский класс в: Target > Build Phase > Compile Sources.

Поэтому я рекомендую вам проверить, есть ли ваш CustomClass.m.

Изображение 1588

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

  • 0
    Это то, что случилось со мной и, к счастью, нашло выход! Я пришел сюда, чтобы ответить, но ты был первым. Спасибо!!!
9

Я столкнулся с этой проблемой в Xcode 6.1, когда я удалил Main.storyboard, файл LaunchScreen.xib и классы по умолчанию ViewController из моего проекта.

Я исправил его, удалив записи Launch Screen File и Main Interface из Info.plist

8

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

  • 0
    Я снова столкнулся с этой проблемой в бета-версии Xcode 7, так как раньше у меня она была в Xcode 6. На этот раз этот метод работает для меня.
  • 0
    Любая известная причина для этой работы?
Показать ещё 1 комментарий
7

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

7

Эти шаги работают для меня.

1) Очистить производные данные.
2) Удалите файлы .h и .m
3) Создайте файлы .h и .m Again

  • 0
    Это сработало и для меня. Я даже заставил это работать без очистки производных данных.
  • 0
    Это сработало для меня, большое спасибо, Арвин, но все же я не понимаю, почему возникает такая ошибка, потому что я ничего не изменял в классе или в IB раньше
Показать ещё 1 комментарий
6

Мое решение (Xcode 8.1 Swift 3.0):

Неизвестный класс xxx в файле Interface Builder.

Откройте StoryBoard в качестве исходного кода и найдите xxx. Удалить атрибут, который содержит значение xxx. Построить и запустить.

  • 0
    WTF? Это было абсолютно необходимо для меня, спасибо. Мне пришлось удалить customModule="" customModuleProvider=""
  • 1
    Если мы попытаемся опубликовать приложение в магазине приложений с такой ошибкой, приложение будет отклонено бездумно.
Показать ещё 1 комментарий
6

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

Вам также может потребоваться указать целевого поставщика. Для достижения этой цели вы можете открыть раскадровку в режиме исходного кода и добавить атрибут customModuleProvider в обеих скобках ViewController и View.

6

Что говорит @gfrs правильно, вам нужно установить модуль. Однако однажды я столкнулся с проблемой, что мой класс не указан в раскрывающемся списке Class. В конце концов я удалил быстрый файл, перезапустил Xcode и заново создал файл. Наконец, класс был указан и может использоваться в раскадровке.

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

  • 0
    это работало для меня в бета-версии XCode 7 - та же проблема.
  • 0
    Удаление и повторное добавление файла класса работал для меня. Спасибо!
4

В моем случае я добавил флаг -ObjC в Other Linker Flags в настройках проекта, чтобы он работал. Также я попробовал флаг -all_load, и он тоже хорошо работал.

Изображение 1589

3

В моем случае класс, на который ссылается в Storyboard/xib, не было установлено Target Membership.

Чтобы исправить, дайте этому классу .h и .m файлы те же целевые членства, что и ваши другие классы.

Изображение 1590

  • 0
    Это была моя проблема, но, пробуя различные решения, я вызвал проблему, которую исправляет ответ Epic Byte. Вы должны иметь свой исходный код в целевом объекте, который вы строите, но также в IB вы должны установить контроллер представления как часть текущей цели.
  • 0
    Целевое членство было моей проблемой, смотрел везде, но благодаря этому ответу я смог ее решить.
2

Я исправил это в соответствии с тем, что предложила Лора, но мне не нужно было воссоздавать файлы.

Используя XCode 4, в Навигаторе проектов выберите файл .m, содержащий класс, на который он жалуется

Перейдите в View- > Utilities- > Show File Inspector (это покажет File Inspector справа, с этой информацией .m-file)

Откройте раздел Целевое членство и убедитесь, что ваша цель выбрана для этого .m файла

Когда я добавил свой файл .m в свой проект, он почему-то не добавил его к моей целевой по умолчанию, и это заставило меня получить указанную вами ошибку.

  • 0
    используя xcode 4? Мы в 7 сейчас ...
2

Моим решением было удалить @objc из определения пользовательского класса.

  • 1
    Некоторый пример с объяснением был бы великолепен.
2

Я столкнулся с проблемой, когда портировал раскадровку из проекта Swift в проект Objective-c, заметив vvkuznetsov answer, оказалось, что два проекта используют один и тот же идентификатор. я "Продукт → Очистить" и нажмите клавишу "Enter" в поле "Текст модуля" и "Класс". проблема исчезла.

1

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

1

Решение для меня было другим. Вы должны добавить .m класса к фазе сборки, скомпилированным источниками цели.

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

1

У меня возникла эта проблема после того, как я добавил новую цель, а затем создал новый класс, используя диалог "Новый файл", но случайно не смог проверить новую цель, а также исходную цель в диалоговом окне создания, поэтому объект был только добавлен к моей исходной цели. Решение заключалось в том, чтобы удалить исходные файлы (только удалить ссылку), а затем добавить их обратно, используя "Добавить файлы", на этот раз проверяя обе цели.

1

У меня была такая же проблема с Xcode Version 6.1 (6A1052d). Я думаю, проблема возникает, если вы переименовали свой проект App/Xcode.

Мое решение состояло в том, чтобы вручную добавить имя модуля в конструктор интерфейса.

1

То, что только работало для меня, фактически добавляет имя модуля в файл xib...

Sooo, xib файлы выглядят следующим образом:

mymodule.MyViewController.xib (Module being the name of the proyect, usually)

УЖАСНОЕ решение, на мой взгляд, но это якобы то, как Apple хочет, чтобы мы это делали сейчас.

Этот вопрос показывает 3 возможных решения проблемы в бета-версии 4... очевидно, что Apple не очень помогла в этой ситуации в соответствии с некоторыми из-за того, что они называют ее "Working как предполагалось."

0

Это действительно странно, когда XCode 10 остановился на "уточнение debugs".
В моем случае я установил UITableViewDelegate и UITableViewDataSource со Storyboard и забыл реализовать эти необходимые методы.
Я просто хотел сначала проверить тест, прежде чем реализовать эти методы, а затем сбой! XCode 9, будет предупреждать об этих методах, но XCode 10, действительно сделал мой код медленным, а не на этом, другие я был через это "ошибка сомнения".
Надеюсь, это поможет кому-то.
Спасибо

0

Я пользователь PyObjC и у меня NSView подкласс NSView в собственном файле. Для меня это NSView подкласс NSView из собственного файла в файл AppController.py. Это файл, в котором есть контроллер приложения.

0

Моя проблема была ошибкой пользователя. У меня был общий UIView в моей раскадровке, а в разделе Custom Class из Identity Inspector я случайно сменил имя с UIView на тарабарщину.

Все, что нужно было исправить, это изменить его на UIView.

0

Swift 3.

Все это НЕ работало.

  • Нажатие на Module на правой панели НЕ работало.
  • Добавление @obj НЕ сработало.
  • Перезапуск не работал.
  • Переход на рабочий стол по мере того, как разрывы xcode для более длинного пути НЕ работают. ...

Это сработало наконец.

Просто создайте новый каталог и создайте новый проект внутри этого. Добавьте файлы, кроме Main.sotryboard.

Теперь скопируйте контроллеры представления из предыдущего проекта и вставьте его в новую Main.storyboard.

Войла! Это работает.

  • 0
    Можете ли вы проверить git и посмотреть, что изменилось внутри раскадровки? Было бы неплохо исправить это вручную, если это просто ...
  • 0
    Я не использовал git для этого проекта.
0

Для меня проблема заключалась в том, что я ссылался на пользовательский класс в раскадровке (который соответствовал файлу .h), но у меня не было команды @implementation в файле .m.

0

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

Мы поделились с XIB и запустили образы в раскадровки, и я еще не успел снова запустить экран запуска. Когда я наконец добрался до создания раскадровки для обнаженных костей без каких-либо настраиваемых контроллеров представлений (которые не разрешены), эти ошибки консоли перестали появляться.

0

Моя проблема была связана с каркасом podfile (в частности, с BWWalkthrough). Ни один из вышеперечисленных решений не работал у меня, и как бы я ни старался, я не мог заставить модуль указывать на мое приложение.

Что для меня работало, так это удаление библиотеки в виде podfile и добавление ее непосредственно в мой проект как статическую библиотеку. После этого все было тяжело. Не совсем уверен, что было "сломано" с реализацией класса класса.

  • 0
    У меня была та же проблема с пользовательским модулем pod - установка модуля для имени podname помогла мне. Вы можете найти здесь мой ответ с иллюстрацией скриншота, если это необходимо.
  • 0
    Установка модуля как BWWalkthrough заставила сообщения идти за мной.
0

Для меня я использую Xcode7 + Swift2

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

 self?.navigationController?.pushViewController(vc, animated: true)

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

0

У меня была такая же проблема с Xcode 6.3, когда я добавлял файлы в "myapp". Это потому, что я выбираю "создать ссылку на папку" вместо "создавать группы". Я удаляю эти файлы и добавляю их снова с опцией "create groups". И проблема исправлена.

0

в моем случае, я настраиваю приложение как универсальное приложение, поэтому xcode создает две раскадровки. Но я использовал только (разработанную) только раскадровку iPhone. и пытается запустить приложение в iPad. Для решения проблемы просто нужно сделать приложение, как только для iPhone, и отлично работает.

0

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

0

В mij случае ViewController.h/m, где в lib. Проекты все еще строятся, но с Xcode 6.3 приведенная выше ошибка была показана во время выполнения. Перемещение обоих файлов обратно в проект решило проблему.

0

Это работало для меня, когда ничего больше не делалось. Из каталога проекта в терминале:

[~/Developer/MyProject] grep -rn ViewController * | grep -i xib 

Откройте сопоставленные файлы в качестве исходного кода в Xcode и измените любые экземпляры ViewController на то, что вам действительно нужно. В моем случае файлом, который мне нужно было открыть в качестве источника, была Main.storyboard, и я изменил экземпляры ViewController на DetailViewController.

Я удалил два файла из Xcode и main.storyboard, что, по моему мнению, вызвало эту проблему для меня.

0

У меня была та же проблема, но не с тем же исправлением.

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

Когда он откроется, перейдите в проект построителя интерфейса, и вы увидите, что он узнает ваш script. Затем вы нажимаете действительно на имя своего script и нажимаете enter, u увидит, что ввод модуля заполнит его.

И это будет работать как шарм!: D

0

Это случилось со мной, потому что мой класс был отмечен @objc, а в sotryboard он не смог найти модуль. Удаление @objc устраняет проблему

0

У меня возникла проблема, когда я создал проект с тем же именем, который уже существует в каталоге моих проектов (хотя он был удален некоторое время назад). Я написал свое решение там https://stackoverflow.com/questions/13730347/xcode-unknown-class-in-interface-builder-file

0

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

0

Я столкнулся с такой проблемой на Xcode 6, когда я удалил уже включенные файлы ViewController.h и ViewController.m из моего нового проекта, основанного на представлении, и удалил сцену, связанную с этим классом, из раскадровки, Xcode использует эти файлы в, поэтому, если вы попытаетесь перейти в Window → Projects → your_project и удалить производные данные, все будет хорошо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню