Хотя Interface Builder знает об этом MyClass
, я получаю сообщение об ошибке при запуске приложения.
Это происходит, когда MyClass
является частью библиотеки, и не происходит, если я скомпилирую класс непосредственно в цели приложения.
Хотя Interface Builder знает об этом MyClass
, я получаю сообщение об ошибке при запуске приложения.
Это происходит, когда MyClass
является частью библиотеки, и не происходит, если я скомпилирую класс непосредственно в цели приложения.
Ответы:
Несмотря на ошибку « Неизвестный класс MyClass в файле Interface Builder. », Напечатанную во время выполнения, эта проблема не имеет ничего общего с Interface Builder, а связана с компоновщиком, который не связывает класс, поскольку ни один код не использует его напрямую.
Когда данные .nib (скомпилированные из .xib) загружаются во время выполнения, на MyClass
них ссылаются с помощью строки, но компоновщик не анализирует функциональность кода, а только существование кода, поэтому он этого не знает. Поскольку никакие другие исходные файлы не ссылаются на этот класс, компоновщик оптимизирует его при создании исполняемого файла. Поэтому, когда код Apple пытается загрузить такой класс, он не может найти связанный с ним код и выводит предупреждение.
По умолчанию для целей Objective-C будут установлены -all_load -ObjC
флаги по умолчанию, в которых будут храниться все символы. Но я начал с цели C ++, и у меня ее не было. Тем не менее я нашел способ обойти это, что делает линкер агрессивным.
Хак, который я изначально использовал, заключался в добавлении пустой статической подпрограммы, например:
+(void)_keepAtLinkTime;
который ничего не делает, но я бы назвал один раз, например:
int main( int argc, char** argv )
{
[MyClass _keepAtLinkTime];
// Your code.
}
Это заставит компоновщик сохранить весь класс, и ошибка исчезнет.
Как указал в комментариях jlstrecker, нам не нужно добавлять _keepAtLinkTime
метод. Просто вызывая существующий, такой как:
[MyClass class];
делает трюк (до тех пор, пока вы производите от NSObject
).
Конечно, вы можете назвать это в любом месте вашего кода. Я думаю, что это может быть даже в недоступном коде. Идея состоит в том, чтобы обмануть линкера в том, MyClass
что он где-то используется, чтобы он не был таким агрессивным в его оптимизации.
Быстрое определение зрения. Обязательно переопределите init(coder aDecoder: NSCoder)
. Objective-C определение представления контроллера. И перо в грушевом дереве.
Добавьте Имя модуля в инспектор деталей Nib, где вы выбираете свой класс.
MyClass
. Просто вызовите метод, от которого он наследует NSObject
, например +class
.
MyClass.m
в разделе Target Membership File Inspector.
Я исправил это в соответствии с тем, что предложила Лора, но мне не нужно было воссоздавать файлы.
Используя XCode 4, в Project Navigator выберите файл .m, который содержит класс, на который он жалуется
Перейдите в View-> Utilities-> Show File Inspector
(это покажет File Inspector справа, с этой информацией .m-файла)
Откройте раздел Target Membership и убедитесь, что ваша цель выбрана для этого .m-файла
Когда я добавил свой файл .m в свой проект, по какой-то причине он не был добавлен в целевой объект по умолчанию, и в результате я получил указанную вами ошибку.
Это на самом деле не имеет ничего общего с Interface Builder, здесь происходит то, что символы не загружаются из вашей статической библиотеки XCode. Для решения этой проблемы вам необходимо добавить -all_load -ObjC
флаги в Other Linker Flags
ключ Project (и, возможно, Target) Build Settings.
Поскольку Objective-C генерирует только один символ на класс, мы должны заставить компоновщик загружать члены класса тоже, используя флаг -ObjC, и мы также должны принудительно включить все наши объекты из нашей статической библиотеки, добавив -all_load
флаг компоновщика. Если вы пропустите эти флаги рано или поздно, вы столкнетесь с ошибкой unrecognized selector
или получите другие исключения, такие как тот, который вы наблюдали здесь.
-ObjC
флаг поменял его в моем случае.
-ObjC
достаточно хорошо для решения проблемы.
Я столкнулся с этой проблемой сегодня, используя Swift.
Я изменил класс Model.h + Model.m
на Model.swift
. Этот объект был использован в Интерфейсном Разработчике с class = Model
.
Как только я заменил объект, класс больше не мог быть загружен.
Я должен был изменить ссылку на класс в IB с:
Class = Model
Module =
в
Class = Model
Module = <TARGETNAME>
Вы найдете <TARGETNAME>
в настройках сборки. Это также имя, которое отображается в созданном вами Swift-заголовке:#import "TARGETNAME-Swift.h"
Module
имя было прямо в раскрывающемся списке. Это было название моего приложения.
Перейдите к «ProjectName», нажмите на него, а затем перейдите на вкладку «Build фазы», а затем нажмите «источники компиляции», а затем нажмите кнопку «+», появится окно, выберите «MyClass. m "файл, а затем нажмите" добавить ",
Постройте проект и запустите его, проблема наверняка будет решена
Это проблема с кешем Xcode4, просто удалите все папки в / Users / your_user / Библиотека / Поддержка приложений / iPhone Simulator / 4.3 / Applications /
Кроме того, если у вас есть такая же проблема тестирования на вашем iPhone, удалите старое приложение перед его запуском ...
Удачи. Паскуаль
Иногда 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">
customModule="MyFrameworkName"
. Огромный +10
Мой случай - пытаясь использовать класс из быстрой среды в моем проекте c, я получил эту ошибку. Решением было добавить модуль (swift framework) класса в Interface Builder / Storyboard, как показано ниже. Ничего больше
Перейдите в Build Phases-> Compile Sources и добавьте ваши новые .m файлы.
В моем случае это показало ошибку для класса, который даже не существовал! Я подозревал, что это было что-то запутанное в файле раскадровки. Если вы не можете распознать файл класса в ошибке, попробуйте это:
1) открыть свой проект в возвышенном или другом хорошем редакторе. Поиск класса, на который ссылаются. 2) удалить весь бит, который говорит
customClass="UnrecognizedClassName"
3) сохранить его. 4) вернитесь в xcode, очистите проект и попробуйте запустить его сейчас.
работал на меня.
customClass="MyCla"
). Вместо того, чтобы удалять пользовательское назначение класса, для меня было бы разумно просто поместить класс, который я собирался использовать в первую очередь :)
Я просто хочу добавить этот ответ, так как большинство, если не все ответы здесь предполагают, что класс действительно существует ... просто компоновщик / компилятор слишком туп, чтобы его увидеть ... таким образом, ответы вращаются вокруг либо оповещения компоновщика о существовании класса или создание взлома, чтобы «заставить» существовать это ..
моя проблема возникает, когда это сообщение на самом деле говорит о несуществующем классе .. поэтому в качестве примера я мог бы вернуться к старому git ревизии , которая не знает определенного класса ... все же компилятор жалуется, что указанный класс не ' не существует ..
решение?
ты должен быть хорош, чтобы пойти после этого
Лучший способ устранить ошибку: 1) Выбрать файл класса (.m) 2) В разделе « Целевое членство » «проверить» запись имени проекта.
Я исправил это, скопировав текст из моих class.h и .m, удалив эти файлы классов из проекта и создав новые файлы class.h и .m с тем же именем, используя «Добавить файл». Затем я вставил код обратно в новые файлы, и все отлично заработало. Каким-то образом файлы не были связаны правильно, когда они были созданы. Мне не нужно было использовать какие-либо флаги компоновщика после этого.
Я, наконец, исправил это, я забыл добавить следующий код в мой файл .m:
@implementation MyTableViewCell
@end
Так что это было вызвано тем, что я сделал заполнитель @interface для своей ячейки таблицы, которая имела соединение с элементом в файле .xib, но есть ошибка в Интерфейсном Разработчике, где если @implementation не указан для класса, это не может найти это.
Я прошел через все этапы других форумов, чтобы просмотреть .xib в качестве источника и увидеть MyTableViewCell, хотя я закомментировал его в своем коде. Я попытался сбросить симулятор. Я даже пытался разбить все мои классы на отдельные файлы, названные так же, как интерфейсы, но до этого ничего не получалось.
PS По моему опыту, не имеет значения, если имена файлов .h / .m отличаются от имен @interface. У меня есть несколько файлов, содержащих более одного @interface, и они работают нормально.
PPS У меня есть более подробное объяснение того, почему UITableViewCell и UICollectionViewCell вызывают эту ошибку по адресу https://stackoverflow.com/a/22797318/539149 вместе с тем, как выявлять ее во время компиляции с помощью registerClass: forCellWithReuseIdentifier :.
Это происходит потому, что .xib имеет устаревшую ссылку на старый делегат приложения, который больше не существует. Я исправил это так:
Я попробовал этот и другие ответы, перечисленные на этом сайте, но ни один из них не отсортировал их для меня. Эти комментарии (с http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) помогли:
После поиска, поиска и поиска я наконец обнаружил имя этого удаленного класса, скрытое в файле. Мне пришлось открыть файлы конструктора интерфейса в X-коде, щелкнув по ним правой кнопкой мыши и выбрав «просмотреть как исходный код». Затем в поисках его придумали
<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
.
В моем случае у меня есть XCode6, указанный файл класса .m заканчивается в неправильном месте на этапе сборки - он должен был находиться в разделе Источники компиляции , но в конечном итоге в
Не только в настройках проекта, но и в настройках Target также необходимо добавить -all_load -ObjC flags.
Core-Plot: неизвестный класс CPLayerHostingView в файле Interface Builder
Эта проблема, похоже, не устарела.
У меня была та же проблема с Xcode 8, и я решил ее так же, как smilebot :
Откройте файл раскадровки как «Исходный код» в Xcode:
Найдите класс, на который вы ссылаетесь, и удалите все, что говорит
customClass = "UnrecognizedClassName"
У меня было «Неизвестный класс favouritesButton в файле Interface Builder», и я нашел его в сцене сборника рассказов, где у рассматриваемой кнопки был фиктивный пользовательский класс «favouritesButton» в поле «Класс» в верхней части инспектора идентификации. Я хотел поместить это значение в следующее поле: Идентификационная метка.
Изменение этого значения на «UIButton» решило проблему.
Я столкнулся с этим в Свифте.
Перемещение .xib-файла в папку Base.lproj проекта избавило от этой ошибки.
У меня была эта ошибка, возникающая сегодня при преобразовании моего приложения aaLuminate в Universal под Xcode 4. Это приложение основано на шаблоне утилиты и изначально было построено под Xcode 3.
Чтобы сэкономить время, я скопировал iPhone Main и Flipside Views в соответствующие имена в приложении Universal. Возникла ошибка «Неизвестный класс x в файле Interface Builder». В моем случае ничего не было в файлах или целях XIB.
Я также скопировал файл aaLuminate-Info.plist по другим причинам - для него использовался старый ключ «Основное имя файла пера», установленный в MainWindow.
Как только я удалил этот ключ, это решило проблему!
В моем случае я получил эту ошибку, потому что пытался сохранить некоторую работу, создав новый проект, а затем удалив несколько исходных файлов и скопировав исходные файлы с тем же именем из рабочего проекта. Я также скопировал файл MainStoryBoard, который искал мой RootViewController. Однако когда я удалил исходный RootViewController, а затем добавил его в RootViewController из предыдущего продукта, очевидно, что операция «Добавить файлы» не смогла «поставить галочку» в целевом поле, как предложено выше. Просто просмотрев все импортированные файлы ".m" из newley и убедившись, что установлен флажок целевого членства, все было хорошо. Я думаю, что происходило то, что файл раскадровки искал класс, который был «исключен» из ссылки, потому что целевое членство не было проверено. Удостоверившись, что требуемые файлы для цели так обозначены в целевом членстве в файловом инспекторе, сделали свое дело. Спасибо, Пэт! (см. выше)
В моем случае это было потому, что я объявил подкласс подкласса ячейки UITableView в файле .h (объявление обоих подклассов было в одном и том же файле .h), но забыл сделать пустую реализацию этого второго подкласса в .m файл.
не забудьте реализовать любой подкласс подкласса, который вы объявляете в файле .h! Звучит просто, но легко забыть, потому что Xcode сделает это за вас, если вы работаете с одним классом на файл .h / .m.
У меня был «Неизвестный класс RateView в Интерфейсном Разработчике», где RateView был подклассом UIView. Я поместил UIView на сцену раскадровки и изменил поле Пользовательский класс на RateView. И все же эта ошибка появилась.
Для отладки я изменил имя своего класса на RateView2 и изменил все ссылки на совпадения, кроме поля Пользовательский класс в UIView. Сообщение об ошибке все еще появлялось как прежде с RateView как отсутствующий класс. Это подтвердило, что сообщение об ошибке было связано со значением поля Пользовательский класс. Я изменил это значение на RateView2, а сообщение об ошибке изменилось на «Неизвестный класс RateView2 в Интерфейсном Разработчике». Прогресс сортов.
Наконец, я проверил сами файлы исходного кода в File Inspector. Там я обнаружил, что файл исходного кода (который я скопировал из учебника) не был связан с моей целью. Другими словами, у него не было целевого членства. Я установил флажок, который сделал файл исходного кода класса членом целевого приложения, и сообщение об ошибке исчезло.
В моем случае я удалил класс под названием viewController, не осознавая, что он был выбран с помощью инспектора идентификации раскадровки (в разделе «Пользовательский класс» вверху).
Вам просто нужно просто выбрать правильный класс для контроллера представления в поле Custom Class вашего инспектора идентификации или добавить новый класс в ваш проект и выбрать тот в качестве вашего Custom Class.
Работал на меня!
Я добавил файл «На этапе сборки в цели», и проблема была решена. Инструкции по добавлению файла см. В моем ответе по адресу:
Это немного свело меня с ума, и ни одно из предложенных выше предложений не помогло мне избавиться от ошибки. К счастью, у меня был только один объект IB, использующий класс, поэтому я просто удалил его и добавил обратно с указанным классом. Ошибка ушла ...