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

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

当我在swift中将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可执行文件,这解释了为什么无法加载Framework图像。

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


进一步测试后的信息:

我重新构建框架,同时指定安装目录为〜/ Library / Frameworks,然后将构建的Framework复制到该位置,然后我更新了应用程序目标,以便包含〜/ Library / Frameworks和应用程序和接口的Runpath搜索路径Builder现在正确绘制自定义控件。

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

解决方案是将Xcode中Framework目标的安装目录构建设置设置为@rpath。 然后在构建Application的Xcode项目中添加Application目标的“Runpath Search Paths”构建设置值:@loader_path /../ Frameworks。

使用@rpath代替@executable_path更加灵活。

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

使用Dave Dribin的rpath

Mike Ash的链接和安装