我已经在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复制到该位置,然后我更新了应用程序目标,以便Runpath搜索路径包括〜/ Library / Frameworks和两者Application and Interface Builder现在正确绘制自定义控件。
这不是我需要的解决方案,但它指出了问题所在,我仍然需要找出正确的解决方案。
答案 0 :(得分:6)
解决方案是将Xcode中Framework目标的安装目录构建设置设置为@rpath。然后在构建应用程序的Xcode项目中添加" Runpath搜索路径"构建Application的设置目标值:@loader_path /../ Frameworks。
使用@rpath代替@executable_path更加灵活。
帮助我解决这个问题的两篇博客文章是:
和