在IBDesignable

时间:2015-05-01 15:46:00

标签: ios interface-builder osx-yosemite 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复制到该位置,然后我更新了应用程序目标,以便Runpath搜索路径包括〜/ Library / Frameworks和两者Application and Interface Builder现在正确绘制自定义控件。

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

1 个答案:

答案 0 :(得分:6)

解决方案是将Xcode中Framework目标的安装目录构建设置设置为@rpath。然后在构建应用程序的Xcode项目中添加" Runpath搜索路径"构建Application的设置目标值:@loader_path /../ Frameworks。

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

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

Using rpath by Dave Dribin

Linking and Installing by Mike Ash