64

我有一个 Objective-C 和 Swift 混合的动态框架。并且混合框架与两个纯Objective-C动态框架相关联。

当我尝试使用 IB Designable 标记混合框架中的任何类并在情节提要或 nib 中使用该类时,Xcode 总是说它的实例无法呈现。

并且有错误消息:

IB Designables:无法渲染 WZUITokenField 的实例:dlopen(WZUIKit.framework,1):未加载库:/Library/Frameworks/WZFoundation.framework/WZFoundation 引用自:WZUIKit.framework 原因:找不到图像

IB Designables:无法更新自动布局状态:dlopen(WZUIKit.framework,1):未加载库:@rpath/WZFoundation.framework/WZFoundation 引用自:WZUIKit.framework 原因:找不到图像

WZUIKit 框架是一个 Objective-C 和 Swift 混合框架,而 WZFoundation 是纯 Objective-C。

另外,所有这些 sutff 都可以在设备或模拟器上运行。

4

15 回答 15

83

最后,我通过添加$(CONFIGURATION_BUILD_DIR)目标的构建设置Runpath Search Paths字段解决了这个问题。

此外,您可能需要对 Xcode 执行一些额外的步骤。

  1. 清除项目的 Xcode 派生数据。他们在~/Library/Developer/Xcode/DerivedData
  2. 按清理您当前的构建⌘</kbd>⇧</kbd>K
  3. 构建你的项目
  4. 在情节提要中转到Editor菜单并执行Refresh All Views;等待构建完成,错误应该消失

感谢@Mojtaba

于 2014-11-08T01:15:55.020 回答
20

如果您在构建 Mac 应用程序时遇到同样的问题,添加@loader_path/../FrameworksRunpath Search Paths为我解决了这个问题。

于 2015-01-10T21:24:30.840 回答
13

对我来说,它可以关闭 xcode 并再次重新打开它。之后没有错误。谢谢。

于 2015-08-30T17:07:42.997 回答
11

我在包含 IBDesignables 的框架上遇到了这个错误。

我必须添加$(FRAMEWORK_SEARCH_PATHS)LD_RUNPATH_SEARCH_PATHS我的框架目标的设置中。

更新运行路径设置、构建和刷新情节提要中的视图后,错误消失了。甚至不必清理构建文件夹。

在此处输入图像描述

于 2018-05-18T14:21:34.453 回答
5

有趣的。

首先,WeZZard 的回答让我朝着正确的方向前进,但并不完全是我的解决方案。

在我的 iOS 项目中,有些东西覆盖了Runpath Search Paths我的目标中的字段。它看起来像这样:

LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";

我尝试了他添加的解决方案,$(CONFIGURATION_BUILD_DIR)但它对我不起作用。由于它不起作用,出于习惯,我只是删除了配置条目(回到项目默认值)。当我这样做时,它重置为:

LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'

如果我深入研究我的 xcconfig 文件,它似乎来自 Cocoapods。

似乎与 Alex 一样,这@loader_path是关键,但它在 iOS 上的路径与在 Mac OS X 上略有不同。

于 2016-03-09T09:30:32.377 回答
4

我也在 Mac 项目和 Xcode 7.3.1 上经历过这种情况。在我的例子中,Failed to Render 错误消息中引用的框架根本与绘图无关。

只需转到目标的 General/Linked Frameworks and Libraries 选项卡并将有问题的框架的状态从必需更改为可选,就可以让 IBDesignables 在 IB 中正确更新和绘制。

可选状态

于 2016-08-22T16:42:25.843 回答
4

我在 Xcode 6.4 中遇到了同样的问题,将测试目标成员资格添加到情节提要为我修复了这些错误。

此外,我的测试目标已@loader_path/Frameworks设置Runpath Search Paths为测试目标,而不是原始目标。

在此处输入图像描述

于 2015-07-10T18:17:18.820 回答
3

我只是想出了另一个原因:

当我使用 'Editor -> Debug Selected Views' 时,我看到它崩溃了,因为我使用 CoreGraphics 创建图像并将其用作按钮的背景图像:

class func imageWithColor(color: UIColor, size: CGSize) -> UIImage {

    let rect = CGRectMake(0.0, 0.0, size.width, size.height);
    UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0);
    let context = UIGraphicsGetCurrentContext();    // It's alraedy nil here :(

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);

    let image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;

}

原因很简单,大小为 (0.0, 0.0)。这是为什么?我打电话

super.setBackgroundImage(UIImage.imageWithColor(bgColor, size: self.bounds.size), forState: .Normal)

但在 IB 中 self.bounds.size 此时仍为 0!所以我改了一行:

let rect = CGRectMake(0.0, 0.0, max(size.width, 1.0), max(size.height, 1.0));

现在它可以工作了:)

Apple 应该提供一份关于 IB 的注意事项列表......

于 2016-04-21T05:28:30.823 回答
1

我在 OS X 项目中遇到了这个问题。

就我而言,问题是一个旧项目(NMSSH)包含一个构建设置错误的框架目标。具体来说:

  • INSTALL_PATH被设置为@executable_path/../Frameworks,但正确的设置是/Library/Frameworks
  • SKIP_INSTALL未设置并默认为NO,但正确的设置是YES
  • DYLIB_INSTALL_NAME_BASE没有设置,但正确的设置是@rpath

请注意,所有正确的设置都是您为新创建的框架目标自动获得的。

将设置更改为正确的值后,Xcode 能够@IBDesignable在情节提要中加载我的视图。

于 2016-05-20T03:33:40.590 回答
1

就我而言,我在 initWithFrame/initWithCoder 方法中执行下一步来创建视图:

className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];

但看起来我不应该使用主捆绑包,而是类的捆绑包。所以我用下面的代码替换了它,它起作用了:

bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];

我想也许这可能会对某人有所帮助。

于 2016-02-14T21:46:55.560 回答
1

就我而言,它在私人吊舱内。Xcode 版本 10.3 (10G8)产生渲染错误

就我而言,解决方案非常简单-我只是忘记 public在中间添加@IBInspectable var

正确的变体:

import UIKit

@IBDesignable public class BorderedView: UIView {
    @IBInspectable public var borderColor: UIColor? = UIColor.white {
        didSet {
            if let actualColor = borderColor {
                layer.borderColor = actualColor.cgColor
            } else {
                layer.borderColor = UIColor.white.cgColor
            }
            
            setNeedsDisplay()
        }
    }
    @IBInspectable public var borderWidth: CGFloat = 1 {
        didSet {
            layer.borderWidth = borderWidth
            setNeedsDisplay()
        }
    }
}

PS:编辑器->调试选定视图在我的情况下什么也没做

PS2:AlignedCollectionViewFlowLayout pod 来自我的私有 pod 的依赖项,绝对与此问题无关。

PS3:问题仍然存在

于 2019-08-28T16:23:27.627 回答
0

[我把这个答案放在这里是为了像我这样的人发现这个非常相似的线程而无法找到解决方案]

我在使用时遇到了类似的问题Cocoapods 1.9.1,错误消息与path error以下内容有关(为了方便起见,我添加了 NewLines):

error: IB Designables: 

Failed to render and update auto layout status for 

UITableViewController (kDz-VB-YcS): 

dlopen(YOUR_FRAMEWORK.framework, 1): 

Library not loaded: @rpath/YOUR_FRAMEWORK.framework/YOUR_FRAMWORKReferenced

from: YOUR_FRAMEWORK.frameworkReason: image not found

这是该线程的链接:Cocoapods Issue 7606

在评论中,有人发布了一个解决方案(对我有用)。你需要把这条post_install规则放在你的最后Podfile

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    next unless config.name == 'Debug'
    config.build_settings['LD_RUNPATH_SEARCH_PATHS'] = [
      '$(FRAMEWORK_SEARCH_PATHS)'
    ]
  end
end

然后再次执行pod install,它现在应该可以工作了

希望有帮助~

于 2020-07-29T15:58:47.173 回答
0

我有一个类似的错误,这是由于我的框架视图没有公共初始化程序引起的:

public override init(frame: CGRect) {
    super.init(frame:frame)
    commonInit()
}

required public init(coder: NSCoder) {
    super.init(coder: coder)
    commonInit()
}
于 2018-12-07T14:51:11.253 回答
-2

请按照以下步骤操作:

  1. 如果情节提要中有任何冲突,请正确解决它们,检查 xml 是否正确验证。(这些是主要步骤。)
  2. 清理项目。
  3. 删除派生数据文件夹。
  4. 退出 Xcode 并重新启动它。(我不得不这样做两次。)
于 2017-11-03T13:35:58.830 回答
-3

清除派生数据。退出 Xcode,重新打开。

于 2019-01-11T15:39:01.773 回答