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

600

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

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

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

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

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

Эпический Байт
источник
Возможный дубликат stackoverflow.com/questions/3416269/…
Bouke
1
@ ImreKelényi Вы правы. Это снова случилось со мной недавно после того, что вы только что описали.
Epic Byte
Это сработало для меня, stackoverflow.com/questions/1725881/…
vrunoa
Для меня это была опечатка, отладить его до элемента Control, пока, когда он придет, выбрать; Контроллер представления> инспектор идентификации> Пользовательский класс> Класс. удалить это, если этот класс не определен.
Маверикс
9
ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ! Эта «ошибка» может происходить из разных источников. Если принятый ответ не работает для вас, тогда двигайтесь вниз и попробуйте следующий ответ. Правильный ответ для моей ситуации был 5-й ответ.
Джексонкр

Ответы:

1454

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

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

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

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

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

Вот изображение, чтобы прояснить ситуацию: введите описание изображения здесь

Эпический Байт
источник
70
Для меня нажатие внутри «Модуль» и нажатие клавиши ввода не работало последовательно, но выбор поля «Класс» (и нажатие клавиши ввода) всегда выполнял свою работу.
Имре Келеньи
2
Для меня цель была установлена ​​правильно, но класс все еще не показывался в IB. Я заметил, однако, что «Расположение» файла показывает путь «Относительно проекта» вместо «Относительно группы». Удаление ссылки на файл И группы и повторное добавление его в корне проекта работал для меня.
knl
8
Ух ты. Спасибо за это, я не думаю, что получил бы там иначе. Это исправило проблему, которая начала происходить после того, как я добавила @objc(...)в один из моих классов Swift.
ndbroadbent
12
Эта проблема все еще присутствует в XCode 7.2. Это решение сработало.
Том Фаст
3
Это все еще проблема в Xcode 8.3.1 ... такой позор
Sepehr Behroozi
99

Иногда 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">
ChikabuZ
источник
7
На самом деле в моем случае мне пришлось удалить customModuleProvider, затем ошибка ушла.
Maciej Swic
3
Гильермо, все еще происходит в Xcode на конец марта!
Эд Мэннерс,
3
@MaciejSwic Удаление также customModuleProviderсделало это для меня, спасибо!
Сакибой
1
как насчет файлов XIB?
SleepsOnNewspapers
7
Все еще происходит ... это такие вещи, которые заставляют меня плакать :(
Лука,
72

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

@objc(ForumTopicListViewController) class ForumTopicListViewController
user1760527
источник
4
Это установил ее для меня, я имел @objc class Xи изменения в @objc(X) class Xработал.
Джо
1
Вы также можете попробовать удалить ваши полученные данные см stackoverflow.com/questions/24039932/...
user1760527
Возникла эта проблема после переименования класса ViewController по умолчанию из шаблона проекта Single View. Интересно, какое волшебство использовалось, чтобы @objc()директива не была нужна для «оригинального» класса ViewController ...
Беренд Кляйн Ханевельд
Я иду противоположную сторону. Я указал имя модуля в файле раскадровки, но также добавил директиву @objc.
WeZZard
1
НЕ работал для меня. :( Также не работает решение имени модуля.
mythicalcoder
64

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

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

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

Мухаммед Наяб
источник
Спасибо за публикацию этого. Решил проблему, которую видел очень быстро.
Джаред,
У меня была похожая ситуация. (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 в свое целевое членство.
Kenster999
Это случилось со мной в новом проекте из шаблона по умолчанию в Xcode 10.1 (одна цель приложения iOS и две цели тестирования). Флажок не был отмечен для всех моих пользовательских контроллеров представления (и поэтому текст заполнителя был «Нет»). После прохождения проверки и установки флажка для каждого настраиваемого контроллера представления в моей раскадровке проблема была решена.
Мейсон
58

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

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

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

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

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

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

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

jovanjovanovic
источник
Спасибо за это. похоже, что следуя вашему предложению, Xcode обновит модуль (под классом в IB) с None на Current. Я думаю, проблема в том, что простой ввод имени без нажатия Enter не может вызвать обновление модуля XCode.
rockiesGrizzly
Это сработало для меня. Я случайно переименовал класс контроллера, так что он, очевидно, больше не существовал, когда контроллер представления был загружен.
Litehouse
32

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

Фуркан Хан
источник
Это было проблемой и для меня - множественные цели приводят к тому, что файл класса случайно не включается в цель, которую я строил.
Райан Креагер
Я объединил файлы и пропустил это в одной из моих целей, отличный ответ
Бенджамин Хименес
Хорошо, слияние pbx сломало целевые значения членства.
система
32

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

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

Арнаб
источник
Confirm. Это помогло мне решить проблему.
Chris8447
У меня обычно возникает эта проблема, когда я конвертирую контроллер вида из Objective-C в Swift. Я набираю последнюю букву и нажимаю Enter. Должен сделать свое дело также.
DevNebulae
30

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

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

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

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

Тамара
источник
18

Я исправил это, сделав прямо противоположное тому, что предложил 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

Орлин Георгиев
источник
17

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

Вот :

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

Рой
источник
13

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

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

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

Георгий Майсурадзе
источник
Хах! Хороший хак :)
Vexy
10

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

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

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

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

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

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

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

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

Vinay Jain
источник
9

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

Якуб Трухларж
источник
8

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

VBaarathi
источник
Я снова столкнулся с этой проблемой в бета-версии Xcode 7, так как я получил ее раньше в Xcode 6. На этот раз этот метод работает для меня.
Джейк Лин
1
В визуальной студии есть похожая проблема. Но там мы получаем четкое предупреждающее сообщение о том, что путь слишком длинный, и что-то нельзя добавить или отредактировать. Не уверен, что с XCODE то же самое, но после этого эпизода я храню все свои проекты в документах или на рабочем столе, и у меня больше никогда не возникало этой проблемы. Я даже дал этот совет кому-то, кто использовал Xamarin Studio, и он также работал на них ...
VBaarathi
7

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

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

Arwin
источник
Это сработало и для меня. Я даже заставил это работать без очистки производных данных.
Jaytrixz
Это сработало для меня, большое спасибо, Арвин, но до сих пор я не понимаю, почему возникает такая ошибка, потому что я ничего не изменял ни в классе, ни в IB раньше
Kirtikumar A.
7

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

Wraithseeker
источник
6

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

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

Bouke
источник
Удаление и повторное добавление файла класса работал для меня. Спасибо!
Николас Миари
6

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

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

Тенг Лонг
источник
6

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

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

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

ibrahimyilmaz
источник
WTF? Это было абсолютно необходимо для меня, спасибо. Я должен был удалитьcustomModule="" customModuleProvider=""
Дэн Розенстарк
1
Если мы попытаемся опубликовать приложение в магазине приложений с такой ошибкой, приложение будет отклонено бездумно.
Ибрагимильмаз
Я не согласен. Я только что представил сборку, которую мне пришлось изменить таким образом, в TestFlight, и она готова к бета-тестированию ... посмотрим, что произойдет в реальном магазине приложений, но это ошибка IMO для IB. Спасибо!
Дэн Розенстарк
4

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

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

Ростислав Дружченко
источник
3

В моем случае классу , указанному в Storyboard / xib, не было задано целевое членство .

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

Целевое членство не установлено.

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

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

DenisKirillov
источник
2
Некоторый пример с объяснением был бы великолепен.
Ниламбар Шарма
2

Я столкнулся с проблемой, когда портировал раскадровку из проекта Swift в проект Objective-c, заметив ответ vvkuznetsov , оказалось, что два проекта используют один и тот же идентификатор. Я «Продукт -> Очистить» и нажмите клавишу ввода в текстовом поле «Модуль и класс». проблема ушла

XHG
источник
2

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

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

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

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

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

Джинеш Калантри
источник
2

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

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

Скутер
источник
Я сделал то же самое, но случайно добавил имя пользовательских контроллеров представления в раздел пользовательских классов корневого представления ViewControllers. Поэтому я посмотрел, почему View Controller не удалось найти, когда он все время был корневым представлением.
TMin
1

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

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

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

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

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

SH
источник
1

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

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

Патрикс
источник
1

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

JulianSymes
источник