静态库、bundle和 IB 可设计



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

在问题导航器中,捆绑包文件:

脚本: IB 可设计对象:无法更新自动布局状态:无法从路径加载可设计对象(空)

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

这是

#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface CustomUIButton : UIButton
@property (nonatomic) IBInspectable int cornerRadius;
@end

我要实时渲染的自定义按钮位于视图控制器内

不幸的是,无法

IBDesignables与静态库(或静态框架)一起使用。

这不是一个很好的答案,但我想给出一些原因的背景。

界面生成器加载要显示为可设计对象的类的方式似乎是通过实际动态加载您创建的动态框架(而不是应用程序的二进制文件),并直接使用这些类(在使用 Objective-C 运行时更改它们之后)。

您可以看到 Interface Builder 没有加载您的应用程序,而是通过以下步骤加载各个框架:

  1. 创建新的 Xcode 项目
  2. 在项目中创建新的框架目标
  3. 添加IBDesignable
  4. 在应用的情节提要中,创建一个视图并将其类设置为框架的IBDesignable
  5. 单击"编辑器"菜单中的"刷新所有视图"
  6. 在项目的 DerivedData 文件夹中的 IBDesignables 目录中,可以看到仅生成了框架目标。

界面生成器实际上使用手动dlopen加载您的框架。您还可以看到,为了在构建框架时促进这一点,Interface Builder 实际上在您的二进制文件中添加了 2 RPATH秒,因此可以在自定义路径中找到依赖项(您可以使用 otool -L frameworkbinary 查看)。这种加载二进制文件的方法不适用于静态库。

对于它的价值,我认为最好的解决方法是构建动态框架,而不是静态库,但仅适用于IBDesignable构建。您必须执行一些配置工作才能完成此操作,并且绕过 Xcode 进行这项工作并不容易,但是如果您尝试这样做,则可以使用构建路径或环境来区分IBDesignable构建与"普通"构建。

编辑:IB Designable和IB Inspectable似乎不适用于静态库,因此,如果您使用的是静态库,请考虑使用动态框架(仅限iOS 8)或将组件移出静态库,如果可能的话。

对于与 Cocoapods 相关的问题,请使用以下解决方案:

这与这个问题有关。

这是解决方案:

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

2) 将use_frameworks!添加到您的Podfile

在此处查看更多内容。