【问题标题】:Failed to render instance of IB Designables无法呈现 IB Designables 的实例
【发布时间】:2015-01-04 02:46:23
【问题描述】:

我有一个 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 都可以在设备或模拟器上运行。

【问题讨论】:

  • 在 InterfaceBuild 中,您无权访问仅在应用程序运行时可用的属性,例如 AppDelegate。这可能会导致此问题。
  • 我不认为这个问题是由访问运行时属性但不正确的构建设置引起的。此问题与我之前遇到的问题非常相似,即当目标仅与自定义框架链接但未嵌入时,应用程序无法加载自定义框架。
  • 另一种解决方案:stackoverflow.com/a/38368740/2245240

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


【解决方案1】:

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

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

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

感谢@Mojtaba

【讨论】:

  • 构建设置称为“运行路径搜索路径”而不是“运行搜索路径”
  • 我补充说,它没有帮助。我还应该做什么?
  • @WeZZard 要改进您的答案,请考虑在更新字段后添加以下步骤。 1. 清除项目的 Xcode 派生数据。 2. 清理/构建 3. 在情节提要中进行编辑并执行“更新所有视图”等待构建完成并且错误应该消失
  • 同样,我必须将此添加到我工作区中的每个项目中
  • 我遇到了完全相同的问题,但这个解决方案对我不起作用。最近有人试过吗? Xcode 7.3 / 斯威夫特 2.2?我正在使用 CocoaPods 将依赖项添加到我的应用程序中,顺便说一下,版本 1.0.0-rc.2。
【解决方案2】:

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

【讨论】:

  • 构建设置称为“运行路径搜索路径”而不是“运行搜索路径”
  • 谢谢,对我帮助很大!
【解决方案3】:

对我来说,关闭 xcode 并重新打开它是有效的。之后没有错误。 谢谢。

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 这对我有用!谢谢!添加$(FRAMEWORK_SEARCH_PATHS),然后点击“编辑器”菜单中的“刷新所有视图”。
    • 重要的是,此配置适用于具有依赖关系的框架开发。 ?
    • 这也是为我修复它的解决方案。 (这里提供的其他人,例如 $(CONFIGURATION_BUILD_DIR),没有。)谢谢!
    【解决方案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。

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

    【讨论】:

    • 我想你的意思是'@executable_path/../Frameworks' 和'@loader_path/../Frameworks'。根据链接框架的构建方式,可能已经在二进制文件上设置了一个或其他路径,并且由于某种原因,整个 IBDesignable 业务都因此而窒息。就我而言,我必须在上面添加“@executable_path”。
    • 不。我的意思是@executable_path/Frameworks。这取决于 Mac OS X(需要 ..)或 iOS(不需要)。但是您可能是对的,它也可能取决于链接框架的构建方式。多么令人愉快的混乱。刚才在查找一些东西时,我看到有人通过添加所有 4 个(两种变体)来解决它。 YMMV。
    • 啊,对,iOS。应该多加注意,谢谢!
    • 不用担心。很好的评论。
    • 令人惊讶的是,这个帮助了我(执行路径更短)+ 关闭 Xcode + 核对所有派生数据文件夹
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

        我刚刚发现了另一个原因:

        当我使用 '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 的注意事项列表...

        【讨论】:

        • 这对我有用!我终于用Debug Selected Views 找出我的问题。我在drawRect: 中绘制东西,并使用在initWithCoder: 中启动的属性,但是当我调试时,代码运行到initWithFrame:,其框架为{0, 0},正是@benjamin.ludwig 的大小问题。
        【解决方案9】:

        在我的例子中,我在 initWithFrame/initWithCoder 方法中执行下一步来创建视图:

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

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

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

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

        【讨论】:

        • 不仅解决了我的问题,还优化了我的代码。金星!
        【解决方案10】:

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

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

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

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

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

        【讨论】:

          【解决方案11】:

          在我的情况下,它在私人吊舱内。 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()
                  }
              }
          }
          

          P.S.: Editor -> Debug Selected Views 在我的情况下什么也没做

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

          P.S.3:问题仍然存在

          【讨论】:

            【解决方案12】:

            我遇到了类似的错误,这是由于我的框架的视图没有公共初始化程序:

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

            【讨论】:

              【解决方案13】:

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

              我在使用Cocoapods1.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

              在 cmets 中,有人发布了一个解决方案(对我有用)。您需要将此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,它现在应该可以工作了

              希望对你有帮助~

              【讨论】:

                【解决方案14】:

                按照以下步骤操作:

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

                【讨论】:

                  【解决方案15】:

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

                  【讨论】:

                    猜你喜欢
                    • 2018-06-24
                    • 1970-01-01
                    • 2015-01-24
                    • 2018-07-21
                    • 2018-03-25
                    • 2020-06-29
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多