静态库,捆绑包和IB Designable

10

我正在尝试在我的UIButton中使用IB Designable和IB Inspectable,但似乎出现了一些错误。

在“Issue Navigator”中,Bundle文件如下:

  

Storyboard:   IB Designables:无法更新自动布局状态:无法从路径(null)加载可设计内容

所以我想知道是否有任何配置可以在静态库中使用它或类似的东西?

这是

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface CustomUIButton : UIButton

@property (nonatomic) IBInspectable int cornerRadius;

@end

我想实时渲染的自定义按钮位于一个视图控制器中

2个回答

5
很遗憾,无法在静态库(或静态框架)中使用IBDesignables。这不是一个很好的答案,但是我想给出一些背景解释原因。看起来Interface Builder加载要显示为设计元素的类的方式是通过实际动态加载您创建的动态框架(而不是您应用程序的二进制文件),并直接使用这些类(在使用Objective-C runtime修改它们之后)。您可以通过以下步骤看到Interface Builder未加载您的应用程序,而仅加载了各个框架:1。创建新的Xcode项目;2。在项目中创建新的框架目标;3。添加一个IBDesignable的类;4。在应用程序的Storyboard中创建一个视图,并将其类设置为您的框架的IBDesignable类;5。在“编辑”菜单中单击“刷新所有视图”;6。在项目的DerivedData文件夹中,在IBDesignables目录中,您可以看到只构建了框架目标。Interface builder实际上使用dlopen手动加载您的框架。您还可以看到,为了方便构建您的框架时,Interface Builder实际上会向您的二进制文件添加2个RPATH,以便在自定义路径中找到依赖项(您可以使用otool -L frameworkbinary查看此内容)。使用静态库无法加载二进制文件。值得一提的是,我认为最好的解决方法是只为IBDesignable构建动态框架, 而非静态库。您需要进行一些配置工作来实现这一点,并且难以绕过Xcode使其正常工作,但是如果尝试,可以使用构建路径或环境区分IBDesignable构建和“正常”构建。

你如何为“正常”和IBDesignable构建创建单独的配置?我想使用IBDesignable UI元素,但我无法切换到动态库。 - Coli88
您可以通过覆盖未记录的LD构建设置来实现此操作,该设置将替换默认的ld可执行文件,并根据包含仅用于这些构建的IBDesginables的构建目录更改设置。请参见https://github.com/keith/swift-staticlibs以获取使用此构建设置并解析传递给ld的参数的示例。 - Keith Smiley

-2

编辑:IB Designable 和 IB Inspectable 似乎无法与静态库一起使用,因此如果您正在使用静态库,请考虑使用动态框架(仅适用于iOS 8),或者将您的组件移动到静态库之外(如果可能)。

有关 Cocoapods 的问题,请使用以下解决方案:

这与 此问题 相关。

以下是解决方案:

1)安装 Cocoapods(0.36.0.beta.1) 或更高版本;

2)在 Podfile 中添加 use_frameworks!

更多信息请参见 这里


5
他没有明确说明他使用的是 CocoaPods。这个问题似乎会影响 IB_DESIGNABLES,它们位于静态库中,并在另一个项目的 storyboard 或 xib 中使用。 使用 use_frameworks! 指令似乎可以告诉 CocoaPods 导入框架而不是静态库。 - Alex Salom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接