我找到了一种将可设计对象和可检查对象与 Cocoa Touch 框架一起使用的方法。以下说明适用于 Objective-C 项目和 Xcode 8(我没有在旧版本上测试),如果涉及 Swift 代码,应该是相同的。
由于 Interface Builder 在框架中没有发现可设计对象,因此在框架标头中将类标记为 IB_DESIGNABLE 是没有用的。 Interface Builder 只会在编译项目源文件时发现可设计的类。因此,我们的想法是将这些信息作为框架配套源文件提供,然后客户可以使用他们的项目对其进行编译。
我发现您不必子类化即可将框架类标记为项目中的可设计类。您可以简单地注释每个必须通过伴随.msource 文件中声明的类别来指定的类,例如:
IB_DESIGNABLE
@interface MyCustomView (Designable)
@end
事实上,代码甚至不需要编译,你可以将它包装在一个封闭的#if 0 ... #endif 中,它仍然可以工作。所需要的只是该类以某种方式与IB_DESIGNABLE 属性相关联。
考虑到这些信息,以下是如何使可设计对象与 Cocoa Touch 框架一起使用:
如果您是框架供应商:
- 如果需要,有必须可设计的组件实现
-prepareForInterfaceBuilder
- 将文件夹引用(蓝色文件夹)添加到您的框架目标,其中包含伴随的
.m 文件。可能的命名约定是将文件夹命名为 Designables 和其中的文件
MyFrameworkNameDesignables.m,但你可以选择你最喜欢的。
- 在
.m 文件中,为每个必须可设计的视图创建一个与上述类似的类别。文件本身必须可由客户端项目编译,这意味着您需要进行必要的导入(例如,您的框架全局公共标头 #import <MyFramework/MyFramework.h>)或使用上面的 #if 0 ... #endif 技巧
通过将文件包含在蓝色文件夹中,我们确保该文件夹按原样复制到最终的.framework 产品中,而不会编译伴随的源文件。此外,由于该文件夹是框架包的一部分,它可供框架的所有客户端使用,无论是直接集成还是使用 Carthage。
如果您有一个使用框架作为目标依赖项的演示项目,并且如果您的框架依赖于其他框架,则在尝试在演示项目中呈现可设计视图时会遇到dlopen 问题。这是因为在框架目标中发现了IB_DESIGNABLE 属性(因为已将Designables 文件夹添加到其中),Xcode 预构建在与您的项目对应的Build/Intermediates/IBDesignables 派生数据文件夹中。如果您查看此文件夹的内容,则缺少框架依赖项,从而导致dlopen 问题。
要修复演示中的渲染,只需将 Copy Files 阶段添加到框架目标,将每个所需的框架依赖项添加到文件列表中,并将 Products 目录 设置为目的地。现在,当 Xcode 构建您的演示以进行渲染时,它也会包含依赖项。
如果您是具有可设计支持的框架的用户:
- 将框架(及其所有框架依赖项,如果有)作为嵌入式二进制文件添加到您的目标
- 从框架包中检索配套源文件并将其复制到您的项目中,并将其添加到您的目标中。遗憾的是,添加位于框架内的文件或使用符号链接不起作用,因为 Xcode 似乎根本不在框架内查看
- 将可设计视图类的实例(在我们上面的示例中为
MyCustomView)添加到情节提要。 Interface Builder 应该构建项目并渲染视图
此解决方案并不完美,因为您仍然必须手动复制提供的源文件,这可能会在框架版本之间发生变化。但它工作得很好,并且提供了框架包本身所需的一切。