虽然广告宣传Xcode 4了解共享工作区中的跨项目类项目,但我没有发现这有效并且对该问题进行了一些研究。在这里的许多线程中讨论的常见解决方案是,创建一个静态库并将项目链接到它。
因此,我遵循了Jonah的指南(http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/)并创建了一个静态库,以便与多个项目共享经常使用的UIView子类。
通过一些试验和错误经验和故障排除,我发现这个解决方案确实令人满意和干净,但仍然存在一些复杂情况:
(1)静态库无法共享XIB文件
在我做了研究之后,似乎无法从静态库项目外部访问XIB文件而不将它们拖入到创建引用所需的每个项目中。给定静态库中的UIViewController子类应该从XIB加载 - 虽然可以从任何链接静态库的项目访问UIViewController子类,但是如果不将XIB文件添加到该项目,则不能调用'initWithNibName'。 / p>
我暂时通过在我需要的每个项目中创建对静态库的XIB文件的引用来解决这个问题 - 是否有更好的解决方案?
(2)Interface Builder不知道静态库中的类
虽然我可以在我的静态库中选择UIView的一个子类作为我在项目中拖入XIB的对象的类(即使使用自动完成),但我在运行时遇到错误“Unknown class [UIViewSubclassName]在Interface Builder文件中。“
我在这里找到的解决方案 - Interface Builder can't see classes in a static library - (将头文件拖到XIB-Browser中以使Interface Builder识别该类)显然已停止使用新的Xcode 4 - XIB-Browser被合并到单窗口界面,不响应被拖入其中的头文件。
如何让我的XIB包含来自静态库的对象(例如我的项目中的UIViewController子类应包含我经常使用的一些按钮,因此包含在我的静态库中)而不会在运行时抛出异常?
非常感谢!
PS:其中一些错误发生在编译模拟器没有问题的代码中,但在为设备构建时抛出错误...
答案 0 :(得分:5)
我有一个类似的问题,并通过在我希望包含在项目中的类中声明一个类别来解决它。这迫使从静态库加载类。在课堂上没有定义任何实际方法。
还有一些其他替代品通常用于设置链接器标志 -ObjC和-all_load
**更新以响应代码请求。
我在名为“强制类加载的类别”的项目中添加了一个组,例如,强制将“SimpleAppStateManager”类包含在此项目中(在共享静态库中定义)添加这些'空'类别文件:
#import <Foundation/Foundation.h>
#import "SimpleAppStateManager.h"
@interface SimpleAppStateManager (DART)
@end
#import "SimpleAppStateManager+DART.h"
@implementation SimpleAppStateManager (DART)
@end