从 IBDesignable 中的自定义控件的框架加载代码

Loading code from a framework for a custom control in IBDesignable

我在 OS X 应用程序中实现了一个自定义控件,它工作正常。绘制控件时,它使用来自非系统框架的代码。控件写在swift,框架写在Objective-C。 Framework 不是在与具有自定义控件的应用程序相同的项目或工作区中构建的。我已将框架添加到目标并将其添加到复制文件构建阶段。

当我将 IBDesignable 装饰添加到 swift 中的自定义控件 class 时,尝试在 Interface Builder 中查看该控件时出现错误。我得到的错误是:

file:///Users/ktam/github/MovingImagesDemo/Spinner2/SpinnerController.xib: error: IB Designables: Failed to render instance of Spinner: dlopen(Spinner2.app, 1): Library not loaded: @executable_path/../Frameworks/MovingImages.framework/Versions/A/MovingImages Referenced from: Spinner2.app Reason: image not found

当我检查在 IBDesignables 子文件夹中创建的应用程序包时,框架位于应用程序包中的正确位置。我假设在这种情况下实际上是 运行 的可执行文件不是 IBDesignables 应用程序包中的那个,而是可能是某种 Interface Builder 可执行文件,这解释了为什么无法加载框架图像。

我需要做什么来加载 Interface Builder 在使用 IBDesignable 呈现视图时可以找到的代码?


进一步测试后的信息:

我在将安装目录指定为 ~/Library/Frameworks 的同时重建了 Framework,然后将构建的 Framework 复制到该位置,然后我更新了应用程序目标,以便包含 Runpath 搜索路径 ~/Library/Frameworks 并且应用程序和界面生成器现在都可以正确绘制自定义控件。

这不是我需要的解决方案,但它指出了问题所在,我仍然需要找出正确的解决方法。

解决方案是将 Xcode 中框架目标的安装目录构建设置设置为 @rpath。然后在构建应用程序的 Xcode 项目中,将值添加到应用程序目标的 "Runpath Search Paths" 构建设置中:@loader_path/../Frameworks.

使用@rpath 而不是@executable_path 更加灵活。

帮助我解决这个问题的两篇博文是:

Using rpath by Dave Dribin

Linking and Installing by Mike Ash