4

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

当我快速将 IBDesignable 装饰添加到自定义控件类时,尝试在 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 的同时重建了框架,然后将构建的框架复制到该位置,然后我更新了应用程序目标,以便运行路径搜索路径包括 ~/Library/Frameworks 以及应用程序和接口Builder 现在可以正确绘制自定义控件。

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

4

1 回答 1

6

解决方案是将 Xcode 中框架目标的安装目录构建设置设置为 @rpath。然后在构建应用程序的 Xcode 项目中,将值添加到应用程序目标的“运行路径搜索路径”构建设置中:@loader_path/../Frameworks。

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

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

使用 Dave Dribin 的 rpath

Mike Ash 的链接和安装

于 2015-05-01T19:45:30.420 回答