Ошибка "Неизвестный класс <MyClass> в файле Interface Builder" во время выполнения

Несмотря на то, что интерфейс Builder знает о MyClass, я получаю сообщение об ошибке при запуске приложения.

Это происходит, когда MyClass является частью библиотеки и не происходит, если я скомпилирую класс непосредственно в целевом приложении.

Ответ 1

Несмотря на "Неизвестный класс MyClass в файле Interface Builder". ошибка, напечатанная во время выполнения, эта проблема не имеет ничего общего с интерфейсом Builder, а скорее с компоновщиком, который не связывает класс, потому что никакой код не использует его напрямую.

Когда данные .nib(скомпилированные из .xib) загружаются во время выполнения, MyClass ссылается на строку, но компоновщик не анализирует функциональность кода, а только существование кода, поэтому он не знает, что, Поскольку никакие другие исходные файлы не ссылаются на этот класс, компоновщик оптимизирует его из существования при создании исполняемого файла. Поэтому, когда код Apple пытается загрузить такой класс, он не может найти связанный с ним код и выводит предупреждение.

По умолчанию для целей Objective-C будут установлены флаги -all_load -ObjC, которые будут содержать все символы. Но я начал с цели С++ и не имел этого. Тем не менее, я нашел способ обойти это, что удерживает компоновщик агрессивным.

Сначала я использовал hack, чтобы добавить пустую статическую процедуру, например:

+(void)_keepAtLinkTime;

который ничего не делает, но я бы назвал один раз, например:

int main( int argc, char** argv )
{
   [MyClass _keepAtLinkTime];
   // Your code.
}

Это заставит компоновщик сохранить весь класс, и ошибка исчезнет.

Как отметил jlstrecker в комментариях, нам не нужно добавлять метод _keepAtLinkTime. Просто назовите существующий, например:

   [MyClass class];

делает трюк (пока вы выходите из NSObject).

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

Xcode 6.3.2 и Swift 1.2

Быстрое определение вида. Обязательно отмените init(coder aDecoder: NSCoder). Objective-C определение контроллера вида. И, наконечник в грушевом дереве.

Добавить имя модуля для инспектора деталей Nib, где вы выбираете свой класс.

Ответ 2

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

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

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

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

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

Ответ 3

Это на самом деле не имеет ничего общего с Interface Builder, здесь происходит то, что символы не загружаются из вашей статической библиотеки Xcode. Чтобы решить эту проблему, вам нужно добавить -all_load -ObjC в Other Linker Flags в настройках сборки проекта (и, возможно, цели).

Так как Objective-C генерирует только один символ на класс, мы должны заставить компоновщик загружать члены класса тоже, используя флаг -ObjC, и мы также должны принудительно включить все наши объекты из нашей статической библиотеки, добавив -all_load флаг компоновщика. Если вы пропустите эти флаги рано или поздно, вы столкнетесь с ошибкой unrecognized selector или получите другие исключения, такие как тот, который вы наблюдали здесь.

Ответ 4

Сегодня я столкнулся с этой проблемой с помощью Swift.

Я изменил класс Model.h + Model.m на Model.swift. Этот объект использовался в Interface Builder с class = Model.

Как только я заменил объект, класс больше не может быть загружен.

Мне нужно было изменить ссылку на класс в IB:

Class = Model
Module = 

to

Class = Model
Module = <TARGETNAME>

Вы найдете <TARGETNAME> в настройках сборки. Это также имя, которое появляется в вашем сгенерированном Swift-заголовке: #import "TARGETNAME-Swift.h"

Ответ 5

Перейдите к "ProjectName", щелкните по нему, а затем перейдите на вкладку "Фазы сборки", а затем щелкните "Источники компиляции", а затем нажмите кнопку "+", появится окно, выберите "MyClass.m", а затем нажмите "добавить",

Создайте проект и запустите его, проблема, безусловно, будет решена.

Ответ 6

Это проблема кеша Xcode4, просто удалите все папки в /Пользователи/your_user/Library/Поддержка приложений /iPhone Simulator/4.3/Приложения/

Также, если у вас такое же тестирование на вашем iPhone, удалите старое приложение перед его запуском...

Удачи. Паскуаль

Ответ 7

Иногда IBuilder пропустил 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">

Ответ 8

Перейдите в раздел "Сборка фаз- > " Скомпилировать источники "и добавьте новые .m файлы.

Ответ 9

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

1) откройте свой проект в возвышенном или другом хорошем редакторе. Найдите класс, на который ссылается. 2) удалите весь бит, который говорит

customClass="UnrecognizedClassName"

3) сохраните его. 4) вернитесь к xcode и очистите проект и попробуйте запустить его сейчас.

работал у меня.

enter image description here

Ответ 10

Мое дело. Пытаясь использовать класс из быстрой структуры в моем объектном проекте c, я получил эту ошибку. Решение заключалось в том, чтобы добавить модуль (swift framework) класса в Interface builder/Storyboard, как показано ниже. Больше ничего

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

Ответ 11

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

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

решение?

  • Nuke все! сначала удалите все файлы сборки и т.д., удалив все содержимое в этом каталоге ~/Library/Developer/Xcode/DerivedData​​li >
  • удалите приложение из самого телефона (и очистите содержимое симулятора, если вы используете симулятор).

вы должны быть добры после этого

Ответ 12

Лучший способ удалить ошибку: 1) Выберите файл класса (.m) 2) В разделе " Целевое членство", "проверить" запись имени проекта

Ответ 13

Я исправил это, скопировав текст из моих классов .h и .m, удалив эти файлы классов из проекта и создав новые файлы class.h и .m с тем же именем, используя "Добавить файл". Затем я вставил код обратно в новые файлы, и все отлично работало. Так или иначе файлы были неправильно связаны, когда они были созданы. После этого мне не нужно было использовать какие-либо флаги компоновщика.

Ответ 14

Я НАКОНЕЦ исправил это, я забыл добавить следующий код в мой .m файл:

@implementation MyTableViewCell

@end

Так что это вызвано тем, что я создал placeholder @interface для моей ячейки таблицы, у которой было соединение с элементом в файле .xib, но в интерфейсе Builder есть ошибка, если не указано @implementation для класс, он не может его найти.

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

P.S. по моему опыту, не имеет значения, отличаются ли имена файлов .h/.m от имен @interface. У меня есть несколько файлов, содержащих более одного поля @interface, и они работают нормально.

P.P.S. У меня есть более подробное объяснение того, почему UITableViewCell и UICollectionViewCell вызывают эту ошибку в fooobar.com/questions/15664/... вместе с тем, как раскрыть ее во время компиляции с помощью registerClass: forCellWithReuseIdentifier:.

Ответ 15

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

  • Щелкните правой кнопкой мыши на .xib и выберите Открыть как > Исходный код
  • В этом файле выполните поиск старого делегата приложения и замените его новым

Ответ 16

просто добавьте ниже код при запуске метода appdelegate applyatoindidfinishlanching, тогда он будет отлично работать

[класс myclass];

Ответ 17

Я попробовал это, и другие ответы, перечисленные на этом сайте, ни один из них не отсортировал его для меня. Эти комментарии (из http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html) помогли:

После поиска и поиска и поиска я наконец обнаружил имя этого удаленного класса, скрытого в файле. Мне нужно было открыть файлы построителя интерфейса в X-коде, щелкнув правой кнопкой мыши на них и выбрав "view as source code". Затем поиск по нему придумал

<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>com.apple.InterfaceBuilder.IBCocoaTouchP lu gin</string>
<string>*this was the class name*</string>

Просто удаление этой последней строки не исправляет ее, к сожалению, жалуясь на то, что в файле есть неправильное количество элементов. Вам нужно удалить соответствующую строку в секции строк над ней, которая относится к CustomClass.

Ответ 18

В моем случае у меня есть XCode6, указанный файл .m файла указан в неправильном месте в фазе сборки. Он должен был находиться под Источники компиляции, но в итоге Copy Bundle Resources

Ответ 19

Эта проблема, похоже, не устарела.

У меня была такая же проблема с Xcode 8 и она была решена аналогично smilebot:

  • Откройте файл раскадровки как "Исходный код" в Xcode:

    iUFBU.png

  • Найдите класс, на который ссылается, и удалите весь бит, который говорит

customclass= "UnrecognizedClassName"

  1. Еще раз откройте свой файл раскадровки как "interfacebuilder - раскадровку" и перестройте свое приложение.

Ответ 21

Просто удалите MyClass.m и .h и добавьте их в проект снова, это работает для меня.

Ответ 22

У меня был "Неизвестный класс favouritesButton в файле Interface Builder" и отследил его до сцены сборника рассказов, где у данной кнопки был фиктивный пользовательский класс "favouritesButton" в поле Class в верхней части Identity Inspector. Я хотел поставить эту ценность в следующем поле: Идентификационная метка.

Изменение этого параметра на "UIButton" решило проблему.

Ответ 23

Я столкнулся с этим в Swift.

Перемещение файла .xib в проект. База данных Base.lproj избавилась от этой ошибки.

Ответ 24

У меня появилась эта ошибка сегодня, когда я конвертировал мое приложение aaLuminate в Universal под Xcode 4. Это приложение основано на шаблоне утилиты и было первоначально построено под Xcode 3.

Чтобы сэкономить время, я скопировал iPhone Main и Flipside Views на соответствующие имена в универсальном приложении. Я испытал ошибку "Неизвестный класс x в файле интерфейса". В моем случае ничего не было в файлах или целевых XIB файлах.

Я также скопировал файл aaLuminate-Info.plist по другим причинам - у этого был старый ключ "Основное имя файла основного файла", установленное в MainWindow.

Как только я удалил этот ключ, он исправил проблему!

Ответ 25

В моем случае я получил эту ошибку, потому что попытался сохранить некоторую работу, создав новый проект, а затем удалив несколько исходных файлов и скопировав над исходными файлами с тем же именем из рабочего проекта. Я также скопировал файл MainStoryBoard, который искал мой RootViewController. Однако, когда я удалил оригинальный RootViewController и затем добавил в RootViewController из предыдущего продукта, очевидно, что операция "Добавить файлы" не смогла "проверить" целевое поле, как было предложено выше. Просто используя все новые файлы, импортированные ".m" и убедившись, что флажок целевого членства был проверен, все было хорошо. Я думаю, что происходило то, что файл раскадровки искал класс, который был "исключен" из ссылки, потому что целевое членство не было проверено. Убедившись, что необходимые файлы для цели указаны в целевом членстве в инспекторе файлов, сделал трюк. Спасибо, Пэт! (см. выше)

Ответ 26

В моем случае это было потому, что я объявил подкласс подкласса ячейки UITableView в файле .h(декларация обоих подклассов была в том же файле .h), но забыла сделать пустую реализацию этой второй подкласс в файле .m.

не забудьте реализовать какой-либо подкласс подкласса, который вы объявляете в файле .h! звучит просто, но легко забыть, потому что Xcode сделает это для вас, если вы работаете с одним классом на файл .h/.m.

Ответ 27

У меня был "Неизвестный класс RateView в Interface Builder", где RateView был подклассом UIView. Я уронил UIView на сцену Storyboard и изменил поле Custom class на RateView. Тем не менее, эта ошибка появилась.

Чтобы отлаживать, я изменил имя моего класса на RateView2 и изменил все ссылки на совпадение, за исключением поля Custom class в UIView. Сообщение об ошибке по-прежнему появилось, как и раньше, с RateView в качестве отсутствующего класса. Это подтвердило, что сообщение об ошибке было связано со значением поля Custom Custom. Я изменил это значение на RateView2, и сообщение об ошибке изменилось на "Неизвестный класс RateView2 в Interface Builder". Прогресс.

Наконец, я сам проверял файлы исходного кода в Инспекторе файлов. Там я обнаружил, что файл исходного кода (который я скопировал из учебника) не был связан с моей Target. Другими словами, у него не было целевого членства. Я проверил поле, которое сделало файл исходного кода класса членом целевого приложения, и сообщение об ошибке исчезло.

Ответ 28

В моем случае я удалил класс под названием "viewController", не понимая, что он был выбран с инспектором идентификации раскадровки (в разделе "Пользовательский класс" вверху).

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

Работал для меня!

Ответ 30

Это немного меня задело, и ни одно из предложений выше не помогло мне избавиться от ошибки. К счастью, у меня был только один объект IB с использованием класса, поэтому я просто удалил его и добавил обратно с тем же классом. Ошибка исчезла...