【问题标题】:Xcode 4, Interface Builder and the Awareness of Classes in a Static LibraryXcode 4、Interface Builder 和静态库中的类意识
【发布时间】:2011-08-08 02:38:53
【问题描述】:

虽然 Xcode 4 被宣传为知道共享工作区中项目的跨项目类,但我没有发现这可行,并对该问题进行了一些研究。此处许多线程中讨论的常见解决方案是创建一个静态库并将您的项目链接到它。

因此,我按照 Jonah 的指南 (http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/) 创建了一个静态库,以便与多个项目共享 UIView 的常用子类。

通过一些试错经验和故障排除,我发现这个解决方案非常令人满意且干净,但仍然存在一些问题:

(1) 静态库无法共享 XIB 文件

在我做的研究之后,似乎不可能从静态库项目外部访问 XIB 文件而不包括它们,方法是将它们拖到创建引用所需的每个项目中。给定静态库中应从 XIB 加载的 UIViewController 子类 - 尽管 UIViewController 子类可从链接到静态库的任何项目中访问,但如果不将 XIB 文件添加到该项目,则无法调用“initWithNibName”。

我只是通过在我需要的每个项目中创建对静态库的 XIB 文件的引用暂时解决了这个问题 - 有更好的解决方案吗?

(2) Interface Builder 不知道静态库中的类

虽然我可以在我的静态库中选择 UIView 的一个子类作为我在项目中拖入 XIB 的对象的类(即使具有自动完成功能),但我在运行时收到错误消息“未知类 [UIViewSubclassName]在 Interface Builder 文件中”。

我在这里找到的解决方案 - Interface Builder can't see classes in a static library - (将头文件拖到 XIB-Browser 以使 Interface Builder 识别该类)显然停止使用新的 Xcode 4 - XIB-Browser 合并到单窗口界面并且不响应被拖入其中的头文件。

如何让我的 XIB 包含来自静态库的对象(例如,我的项目中的 UIViewController 子类应该包含一些我经常使用的按钮,因此包含在我的静态库中)而不在运行时引发异常?

非常感谢!

PS:其中一些错误发生在为模拟器编译而没有问题的代码中,但在为设备构建时抛出错误...

【问题讨论】:

  • 我实际上找到了问题 (2) 的答案:仅在 XIB 中使用的类不会包含在构建的产品中,因为编译器会积极忽略在代码。在代码中的任何位置短暂调用任何类方法(如 [Foo 类])即可解决问题。

标签: objective-c xcode interface-builder xcode4 static-libraries


【解决方案1】:

我有一个类似的问题,并通过在我希望包含在项目中的类上声明一个类别来解决它。这迫使类从静态库中加载。类中没有定义任何实际方法。

还有其他一些常见的替代方法,例如设置链接器标志 -ObjC 和 -all_load

** 响应代码请求而更新。

我在项目中添加了一个名为“Categories to force class 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

【讨论】:

  • 我知道有一点死灵评论,但你能详细说明一下吗?也许是代码示例?
猜你喜欢
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2012-11-23
  • 2015-01-05
相关资源
最近更新 更多