无法呈现IB Designables的实例

时间:2014-11-07 10:24:52

标签: objective-c xcode swift interface-builder ibdesignable

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

当我尝试使用IB Designable在混合框架中标记任何类并在storyboard或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都适用于任何设备或模拟器。

15 个答案:

答案 0 :(得分:76)

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

另外,您可能需要对Xcode执行一些其他步骤。

  1. 清除项目的Xcode派生数据。他们在~/Library/Developer/Xcode/DerivedData
  2. K
  3. 清洁当前版本
  4. 构建项目
  5. 在故事板中,转到Editor菜单并执行Refresh All Views;等待构建完成,错误应该消失
  6. 归功于@Mojtaba

答案 1 :(得分:17)

如果您在构建Mac App时遇到同样的问题,将@loader_path/../Frameworks添加到Runpath Search Paths可以解决此问题。

答案 2 :(得分:13)

对我而言,它可以关闭xcode并重新打开它。之后没有错误。 感谢。

答案 3 :(得分:5)

我在包含IBDesignables的框架上遇到此错误。

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

更新运行路径设置,构建并刷新故事板中的视图后,错误就消失了。甚至不用清理构建文件夹。

enter image description here

答案 4 :(得分:4)

我有同样的问题在Xcode 6.4中,为故事板添加测试目标成员资格为我修复了这些错误。

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

enter image description here

答案 5 :(得分:4)

有趣。

首先,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。

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

答案 6 :(得分:3)

我刚刚在我的案例中找到了另一个原因:

当我使用'编辑 - >调试所选视图'我看到它崩溃了,因为我使用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的Dos和Don'ts的清单......

答案 7 :(得分:2)

我也在Mac项目和Xcode 7.3.1上体验过这一点。就我而言,“无法渲染”错误消息中引用的框架与绘图完全无关。

只需转到目标的常规/链接框架和库选项卡,并将违规框架的状态从必需更改为可选,允许IBDesignables在IB中正确更新和绘制。

optional status

答案 8 :(得分: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];

我想也许这对某些人有帮助。

答案 9 :(得分:1)

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

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

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

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

将设置更改为正确的值后,Xcode可以在故事板中加载我的@IBDesignable视图。

答案 10 :(得分:0)

按照以下步骤操作:

  1. 如果故事板中存在任何冲突,请正确解决,检查xml是否已正确验证。(这是主要步骤。)
  2. 清理项目。
  3. 删除派生数据文件夹。
  4. 退出Xcode并重新启动它。 (我必须做两次。)

答案 11 :(得分:0)

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

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

required public init(coder: NSCoder) {
    super.init(coder: coder)
    commonInit()
}

答案 12 :(得分:0)

清除衍生数据。 退出Xcode, 再次重新打开。

答案 13 :(得分:0)

就我而言,它位于私人吊舱内。 Xcode版本10.3(10G8)produce rendering error

对于我来说,解决方案非常简单-我只是忘记在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()
        }
    }
}

P.S .:编辑器->在我的情况下,调试选定的视图没有任何作用

P.S.2:来自我的私有Pod的依赖项中的AlignedCollectionViewFlowLayout pod,并且绝对与此问题无关。

P.S.3:问题仍然在这里

答案 14 :(得分: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,现在应该可以了

希望有帮助〜