Xcode 4, Интерфейсный Разработчик и Знание Классов в Статической Библиотеке - PullRequest
11 голосов
/ 18 апреля 2011

Несмотря на то, что 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) Интерфейсный Разработчик не знает о классах в статической библиотеке

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

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

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

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

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

1 Ответ

5 голосов
/ 19 июня 2011

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

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

** update в ответ на запросдля кода.

Я добавил группу в проект с именем «Категории для принудительной загрузки классов» и, например, для принудительного включения класса «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
...