Xcode 4, Interface Builder и осведомленность о классах в статической библиотеке

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

Поэтому я следил за руководством Ионы (http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/) и создал статическую библиотеку для совместного использования часто используемых подклассов UIView с несколькими проектами.

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

(1) Статическая библиотека не может передавать файлы XIB

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

Я временно решил эту проблему, просто создав ссылки на XIB файлы статической библиотеки в каждом проекте, в котором они мне нужны, - есть ли лучшее решение?

(2) Интерфейс Builder не знает классов в статической библиотеке

Хотя я могу выбрать один из подклассов UIView в своей статической библиотеке как класс объекта, который я перетащил в XIB в моем проекте (даже с автозавершением), во время выполнения я получаю сообщение об ошибке "Неизвестный класс [UIViewSubclassName] в файле Interface Builder".

Решение, которое я нашел здесь - Интерфейс Builder не может видеть классы в статической библиотеке - (перетаскивание файла заголовка в XIB-браузер для создания интерфейса Builder класс), по-видимому, перестали работать с новым Xcode 4 - XIB-браузер объединен в однооконный интерфейс и не отвечает на перетаскиваемые файлы заголовков.

Как я могу сделать объекты XIB включенными из статической библиотеки (например, подкласс UIViewController в моем проекте, который должен содержать некоторые кнопки, которые я часто использую и, следовательно, включены в мою статическую библиотеку), не исключая исключения во время выполнения?

Большое спасибо!

PS: Некоторые из этих ошибок возникают с кодом, который компилируется для симулятора без проблем, но бросает ошибки при создании для устройства...

Ответ 1

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

Есть и другие альтернативы, которые обычно связаны с настройкой флагов компоновщика -ObjC и -all_load

** обновление в ответ на запрос кода.

Я добавил группу в проект под названием "Категории для принудительной загрузки классов" и, например, для включения класса "SimpleAppStateManager" в этот проект (который был определен в общей статической библиотеке) добавил эти "пустые ':

SimpleAppStateManager + DART.h

#import <Foundation/Foundation.h>
#import "SimpleAppStateManager.h"

@interface SimpleAppStateManager (DART)
@end

SimpleAppStateManager + DART.m

#import "SimpleAppStateManager+DART.h"

@implementation SimpleAppStateManager (DART)
@end