it-swarm.com.ru

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

Хотя Интерфейсный Разработчик знает о MyClass, я получаю ошибку при запуске приложения.

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

259
jhoule

Несмотря на ошибку "Неизвестный класс 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 где-то используется, чтобы он не был настолько агрессивным в его оптимизации.

Xcode 6.3.2 & Swift 1.2

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

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

218
jhoule

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

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

  • Зайдите в Просмотр-> Утилиты-> Показать инспектор файлов
    (это покажет файловый инспектор справа с информацией .m-файла)

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

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

183
Pat

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

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

68
Alasdair Allan

Я столкнулся с этой проблемой сегодня, используя Swift.

Я изменил класс Model.h + Model.m на Model.Swift. Этот объект использовался в Интерфейсном Разработчике с class = Model.

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

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

Class = Model
Module = 

в

Class = Model
Module = <TARGETNAME>

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

26
Besi

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

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

20
Subbu

Это проблема с кешем Xcode4, просто удалите все папки в папке/Users/your_user/Library/Application Support/iPhone Simulator/4.3/Applications /

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

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

19
Ignacio Pascual

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

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

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

customClass="UnrecognizedClassName"

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

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

enter image description here

13
smileBot

Мой случай - пытаясь использовать класс из фреймворка Swift в моем проекте Objective C, я получил эту ошибку. Решением было добавить модуль (фреймворк Swift) класса в Интерфейсный конструктор/раскадровку, как показано ниже. Ничего больше

enter image description here

13
Dhilip

Перейдите в Build Phases-> Compile Sources и добавьте ваши новые .m файлы.

13
Jackie Lee

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

9
Amit B

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

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

решение?

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

ты должен хорошо идти после этого

9
abbood

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

8
Laura

Я, наконец, исправил это, я забыл добавить следующий код в мой файл .m:

@implementation MyTableViewCell

@end

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

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

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

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

7
Zack Morris

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

[класс myclass];

6
iSpark

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

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

Я попробовал этот и другие ответы, перечисленные на этом сайте, но ни один из них не отсортировал их для меня. Эти комментарии (из 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.

5
user776904

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

5
Sean Dong

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

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

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

  2. Найдите класс, на который вы ссылаетесь, и удалите все, что говорит

customClass = "UnrecognizedClassName"

  1. Снова откройте файл раскадровки как "interfacebuilder - storyboard" и перестройте свое приложение.
4
jaymgee

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

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

3
Paul Finger

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

3
yebw

Не только в настройках проекта, но и в настройках Target также необходимо добавить -all_load -ObjC flags.

Core-Plot: неизвестный класс CPLayerHostingView в файле Interface Builder

3
S.P.

Я столкнулся с этим в Свифте.

Перемещение .xib-файла в папку Base.lproj проекта избавило от этой ошибки.

2
jaime

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

Вам просто нужно просто выбрать правильный класс для контроллера представления в поле Custom Class вашего инспектора идентификации или добавить новый класс в ваш проект и выбрать этот класс в качестве вашего Custom Class.

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

1
Tim

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

1
Jdizzle Foshizzle

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

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

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

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

1
aarthur

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

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

1
horseshoe7

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

1
Don

Я добавил файл "На этапе сборки в цели", и проблема была решена. Инструкции по добавлению файла см. В моем ответе по адресу:

ошибка компоновщика Apple Mach-O (APActivityIcon)

1
Jamal Zafar

У меня был "Неизвестный класс RateView в Интерфейсном Разработчике", где RateView был подклассом UIView. Я поместил UIView на сцену раскадровки и изменил поле Пользовательский класс на RateView. И все же эта ошибка появилась.

Для отладки я изменил имя моего класса на RateView2 и изменил все ссылки для соответствия, кроме поля Пользовательский класс UIView. Сообщение об ошибке все еще появлялось как прежде с RateView как отсутствующий класс. Это подтвердило, что сообщение об ошибке было связано со значением поля Пользовательский класс. Я изменил это значение на RateView2, и сообщение об ошибке изменилось на "Неизвестный класс RateView2 в Интерфейсном Разработчике". Прогресс сортов.

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

1
Robert White

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

extension Buttons {
    public class MyButton: UIButton {
        // ...
    }
}

Когда я извлек класс из расширения, раскадровка наконец-то нашла класс (MyFrameworkButton):

extension Buttons {
    public typealias MyButton = MyFrameworkButton
}

public class MyFrameworkButton: UIButton {
    // ...
}
0
Kukiwon

В моем случае пользовательский класс UIView находится во встроенной среде. Я изменил пользовательский заголовочный файл UIView с "project" на "public" и включил его в основной заголовочный файл.

0
draw

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

class InterfaceController: WKInterfaceController {
    @IBOutlet weak var table: WKInterfaceTable!
}

Важное примечание: просто подключите самый внешний элемент. Например, если вы попытаетесь также установить соединение для чего-либо в таблице, например, метки внутри строки, вы получите ошибку компилятора о том, что выход неверен и не может быть подключен к повторяющемуся содержимому.

0
Korey Hinton

Здесь было много ответов, но ни одно из них не было решением, я отследил его до storyBoard, где у контроллера был пользовательский класс Invalid (класс не существует после того, как я его переименовал)

0
SAFAD

Если разработчик ошибочно принимает форму customModule в IB, то вместо пользовательского класса создается представление UIKit. Это важная проблема. Поэтому я сделал линтер из customModule в IBLinter. имя правила в IBLinter - "custom_module". https://github.com/IBDecodable/IBLinter

0
Satoru Fukagawa

Я увидел эту ошибку, когда изменил имя класса, несмотря на обновление всех соответствующих .h и .m. Оказалось, я пропустил обновление значения 'customClass' в файлах .storyboard. Это решило проблему.

0
Deepa Dhurka

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

0
john elemans

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

0
timv

В моем случае было ошибочное название "Custom Class". Убедитесь, что вы проверили раскадровку на предмет пользовательских классов, которые вы определили.

0
Wilson Soethe Cursino

Эта проблема произошла со мной, когда я добавил вид выбора, а затем удалил его. В случае, если это кому-то поможет, вот как я наконец решил это:

  1. Открыть схему документа в XCODE (не знаю, что такое схема документа? Я тоже не знал - Google google .. :)).

  2. Найдите сцену, в которой появляется предупреждающее сообщение, в окне структуры документа.

  3. На проблемной сцене встаньте (щелкните) на View, а затем в окне Utility (google it) выберите вкладку Identity инспектор и измените имя пользовательского класса на UIView по умолчанию.

Это не так. :)

0
Yizhar

В моем случае я получаю это сообщение об ошибке очень глупой мной: в конструкторе интерфейсов я хотел установить идентификатор UITableViewCell, но я случайно ввел идентификатор в запись "Пользовательский класс" в конструкторе интерфейса.

Я сделал клетки 1000 раз раньше ....

0
Tom

От конструктора интерфейса/раскадровки указывается класс, который недоступен.

Если это известный класс, он не связан.

Если это не класс или просто некоторые символы, это, вероятно, опечатка. В этом случае проверьте все поля в контроллере представления для этого "неизвестного класса". В "Identity Inspector" (третье слева в блоке "Custom Class" находится одно поле "Class", которое, вероятно, содержит неправильное значение. Обычно в нем указывается тип поля (UIView/UILabel и т.д.).

0
Vincent

За Apple Документация

Для 64-битных приложений и приложений для iPhone OS существует ошибка компоновщика, которая не позволяет - ObjC загружать файлы объектов из статических библиотек, которые содержат только категории и не содержат классов , Обходной путь должен использовать флаги - all_load или - force_load .

Короче говоря, добавьте - all_load к "другому компоновщику" в вашем "Настройки сборки" и вам должно быть хорошо.

http://developer.Apple.com/library/mac/qa/qa1490/_index.html

0
Ben Coffman

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

0
Sid

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

0
Amelia777

В моем случае я использовал раскадровку из другого проекта. Посмотрев файл раскадровки xml (например, в TextWrangler), я заметил, что одно из значений атрибута xml "customModule" для контроллера было неправильным (оно все еще ссылалось на старый проект). Изменение этого вручную решило проблему.

0
FredL

В моем случае проблема заключалась в мертвой ссылке IBOutlet. Как только это было исправлено, все снова было хорошо.

0
Michal Shatz