2013-11-09 8 views
0

Я прочитал следующий ответ, поэтому я знаю, что «Неизвестный класс в файле Interface Builder» ошибка может быть решена с использованием опции компоновщика -ObjC. (FYI, MyClass находится в статической библиотеке.)Как «Неизвестный класс <MyClass> в файле Interface Builder» ошибка может быть исправлена, когда строка читает «[Класс MyClass]»?

https://stackoverflow.com/a/6092090/534701

Я также обнаружил, что одна строка кода [MyClass class] в App Делегат может справиться с той же проблемой, не используя -ObjC вариант. Мой вопрос в том, как код может работать.

В соответствии с ответом, приведенным выше, ошибка возникает из-за того, что символы в моих статических библиотеках не загружаются. Тогда это означает, что [MyClass class] позволяет компоновщику загружать символ во время выполнения? (что не имеет смысла)

ответ

2

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

Добавляя эту строку к вашему коду, вы вынуждаете компоновщик добавлять этот класс во время компиляции (а не во время выполнения), заставляя вызов отражения от раскадровки работать должным образом.

+0

спасибо. не путать, я добавил предложение, которое намекает, что компоновщик не связан с временем выполнения. – nephilim

1

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

В IB, где вы можете выбрать свой класс, есть другое раскрывающееся меню прямо под вами, где вы вводите имя ваш класс, называемый «Модуль». Здесь вы можете выбрать либо ничего (для классов в Objective-C), либо вы можете выбрать предварительно заполненный модуль, как правило, имя вашего приложения. Если вы это сделаете, среда выполнения понимает, что этот класс работает в названном Swift-модуле и может его загрузить.

Это работает для проекта, который начинался только как Obj-C, и добавил некоторые быстрые классы, добавленные позже.

+0

Спасибо! Это было именно то, что мне нужно. Для решения этой проблемы необходимо установить IB. –