Ошибка 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">

7
На самом деле в моем случае мне пришлось удалить customModuleProvider, затем ошибка ушла.
— Maciej Swic

3
Гильермо, все еще происходит в Xcode на конец марта!
— Эд Мэннерс,

3
@MaciejSwic Удаление также customModuleProviderсделало это для меня, спасибо!
— Сакибой

1
как насчет файлов XIB?
— SleepsOnNewspapers

7
Все еще происходит ... это такие вещи, которые заставляют меня плакать :(
— Лука,

72

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

@objc(ForumTopicListViewController) class ForumTopicListViewController

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 на наличие неназначенных классов.


Спасибо за это. похоже, что следуя вашему предложению, 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.

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

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


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

9

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

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



8

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


Я снова столкнулся с этой проблемой в бета-версии Xcode 7, так как я получил ее раньше в Xcode 6. На этот раз этот метод работает для меня.
— Джейк Лин

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

7

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

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


Это сработало и для меня. Я даже заставил это работать без очистки производных данных.
— Jaytrixz

Это сработало для меня, большое спасибо, Арвин, но до сих пор я не понимаю, почему возникает такая ошибка, потому что я ничего не изменял ни в классе, ни в IB раньше
— Kirtikumar A.

7

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


6

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

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


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

6

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

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


6

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

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

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


WTF? Это было абсолютно необходимо для меня, спасибо. Я должен был удалитьcustomModule="" customModuleProvider=""
— Дэн Розенстарк

1
Если мы попытаемся опубликовать приложение в магазине приложений с такой ошибкой, приложение будет отклонено бездумно.
— Ибрагимильмаз

Я не согласен. Я только что представил сборку, которую мне пришлось изменить таким образом, в TestFlight, и она готова к бета-тестированию ... посмотрим, что произойдет в реальном магазине приложений, но это ошибка IMO для IB. Спасибо!
— Дэн Розенстарк

4

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

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


3

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

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

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


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

Целевое членство было моей проблемой, смотрел везде, но благодаря этому ответу я смог ее решить.
— Борж


2

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


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 не очень помогла в этой ситуации, по мнению некоторых, потому что они называют это «Работать как задумано».


1

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

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


1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.