it-swarm.com.ru

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

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

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

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

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

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

552
Epic Byte

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

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

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

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

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

Вот изображение, чтобы прояснить ситуацию: enter image description here

1350
Epic Byte

Иногда 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">
96
ChikabuZ

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

@objc(ForumTopicListViewController) class ForumTopicListViewController
68
user1760527

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

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

enter image description here

53
mavericks

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

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

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

43
jovanjovanovic

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

В моем случае я работаю над проектом с несколькими целями, и проблема «наследуется от цели» не была проверена. Выбор «наследовать от цели» решил мою проблему

 enter image description here

43
Muhammad Nayab

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

31
Furqan Khan

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

Это решение предназначено для конкретного случая: для пользовательских views классов из среды Pod (или Carthage). 

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

 enter image description here

27
Tamara

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

<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

15
Orlin Georgiev

Выбрав правильный Module для моего Custom Class, я решил эту проблему. 

Вот :

 enter image description here

13
roy

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

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

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

13
George Maisuradze

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

9
Jakub Truhlář

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

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

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

 enter image description here

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

9
rcmstark

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

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

9
Vinay Jain

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

8
VBaarathi

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

7
Wraithseeker

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

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

7
ARWIN

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

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

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

6
ibrahimyilmaz

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

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

6
Teng Long

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

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

6
bouke

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

 enter image description here

4
Rostyslav Druzhchenko

В моем случае класс , на который есть ссылка в раскадровке/xib, не имел Target Membership set.

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

No target membership set.

3
pkamb

Включение Inherit Module From Target приняло правильный целевой модуль. Это решило проблему.

 enter image description here

3
Arnab Hore

Я столкнулся с проблемой, когда портировал раскадровку из проекта Swift в проект Objective-c, заметив ответ vvkuznetsov , оказалось, что два проекта используют один и тот же идентификатор. Я "Product -> Clean" и нажимаю клавишу ввода в текстовом поле Module and Class. проблема ушла 

2
xhg

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

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

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

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

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

2
Jignesh Kalantri

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

2
danidarko

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

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

1
Scooter

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

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

1
Ruud Visser

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

1
JulianSymes

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

Ооо, XIB-файлы выглядят так:

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

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

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

1
Steven Hernandez

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

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

1
patrickS

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

1
Nix Wang

Swift 3 решение.

Все это не сработало.

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

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

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

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

Вуаля! Это работает.

0
mythicalcoder

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

В итоге мне удалось удалить библиотеку в виде подфайла и добавить ее непосредственно в мой проект в качестве статической библиотеки. После этого все было для меня безрассудно. Не совсем уверен, что «сломано» в реализации класса pod.

0
Simon

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

0
user1766438

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

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

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

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

0
Jippe Joosten

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

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

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

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

0
Chong Guo

Я столкнулся с проблемой, когда создал проект с тем же именем, которое уже существовало в моем каталоге проектов (хотя он был удален некоторое время назад). Я написал свое решение там https://stackoverflow.com/a/27763697/1654692

0
vvkuznetsov

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

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

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

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

0
N R

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

0
aryaxt

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

0
wj2061

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

0
Daniel Arantes Loverde

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

0
bLacK hoLE

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

0
theDuncs

На мне это случилось, потому что мой проект назывался "ä, ü, ö"

0
SwiftNewling

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

0
bob woodwind

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

0
Goran Jakovljevic

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

0
JAHelia

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

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

0
Eric McNeill

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

0
OnTwoWheels