界面生成器 - 无法从路径(null)加载设计元素

73

我有一些自定义控件,已经创建并在新项目中使用它们。但是,在界面构建器中出现了错误:

Failed to update auto layout status: Failed to load designables from path (null)

或者
Failed to render instance of <control>: Failed to load designables from path (null)

我已在另一个项目中测试过控件,它们在界面构建器中似乎可以正确渲染,但是我无法让它们在当前项目中工作。这个错误的原因是什么,我该如何解决?

提前感谢...


1
@N1ghtshade3 我也遇到了同样的问题,而且我遇到问题的控件并不是来自 CocoaPods 的依赖。 - Josh Brown
我也没有使用CocoaPods,但我看过与CocoaPods相关的帖子。我认为CocoaPods已经找到了解决这个问题的方法,但不幸的是我无法在任何地方找到它! - Jake
你是否正在使用 imageNamed(:) 方法加载任何图片? - Daniel Galasko
请查看以下链接:https://github.com/CocoaPods/CocoaPods/issues/2792 和 https://dev59.com/fl4c5IYBdhLWcg3wMn31 - Mehul Thakkar
另一种解决方案:https://dev59.com/fl4c5IYBdhLWcg3wMn31#38368740 - Yaro
17个回答

79

我也遇到了同样的问题。我使用CocoaPods,并且其中有一个pod使用了designables。所以解决方法是在Podfile中添加'use_frameworks!',执行'pod update',重新打开Xcode项目,错误信息就不会再出现了。


这对于iOS 7+来说并不相关,因为它会破坏许多库,比如Realm。 - Dvole
我在测试iOS 8和iOS 9,对我来说它工作正常。 - i89
9
这个方法解决了问题,但添加“use_frameworks!”破坏了我下载的pods的一些导入语句。 - sosale151
2
!use_frameworks会显著增加您的构建大小,供您参考。 - Tyler Thomas
最近我使用Xcode 13.0进行了测试,它也可以正常工作。它已经移除了IBDesignables。 - Kehlin Swain
@KehlinSwain,您是指Xcode 11.0吗?在您发表评论时,Xcode 12本身还不存在。 - Vignesh

15

编辑**

打开 Xcode(但不要打开你的项目),然后点击窗口(从右数第二个)

选择组织器并确保你在项目上,然后删除所有衍生数据。关闭 Xcode,然后重新打开你的项目,让 Xcode 重新索引你的文件,看看是否可以解决问题。


2
我已经尝试了所有这些方法,但当我将IB_Designable和IBInspectable添加回类时,仍然出现相同的错误。 - Jake
2
无法工作。已经尝试多种变体。这不是派生数据问题。 - drekka

7
我正在使用Xcode 7.3,遇到错误后按照以下步骤解决了问题,并使项目恢复之前的状态(即对任何内容没有影响):
  1. 在podfile中添加'use_frameworks!'(当然不要加引号)
  2. 打开终端窗口
  3. cd到项目根目录
  4. 从命令行运行'pod install'
  5. 从podfile中删除'use_frameworks!'
  6. 再次运行'pod install'
  7. 尝试重新构建,看看是否修复了错误;这个方法对我起作用了
看起来这是Xcode偶尔出现的故障之一,我们都见过,特别是当你匆忙完成其他任务时。

1
完美地工作了!感谢您提供的超级清晰、详细的说明(其他人提到了“use_frameworks!”,但没有人提到之后要将其删除,而保留它会导致我的其他 pods 出现问题)。 - Fateh Khalsa

5

如果之前的解决方案对您没有用,请尝试在您的目标中添加pod inherit! :search_paths

样例

  target 'my-app-target' do
    use_frameworks!
    inherit! :search_paths
  end

之后按照之前建议的方法进行pod更新。

4
我不使用CocoaPods,但我使用一个包含IBDesignable项的内部框架,并且也遇到了这个问题。我清理了主项目的派生数据,重新启动了Xcode,但似乎没有解决问题。为了解决它,我必须去窗口> 项目,选择框架项目(而不是使用框架的项目,而是框架项目本身),并删除派生数据。所以,完整步骤如下:
  1. 产品菜单>清理
  2. 按住Option键>产品菜单>清理构建文件夹...>清除
  3. 窗口菜单>项目>选择我的框架项目>删除派生数据
  4. 窗口菜单>项目>选择我的主项目>删除派生数据
  5. 退出Xcode
  6. 重新启动Xcode
对于任何可能导致错误的具有IBDesignables的框架项目,请重复第3步。

3
我不确定这是否能解决您的问题,因为我无法复制它。但是我认为您可以试试。
首先,就像其他人提到的那样,似乎CocoaPods也有同样的问题。我查看了构成其更正的提交,但没有与您的设置相关的结果。
然而,在这个StackOverflow问题中,我发现了一个不同的相关错误消息,也与IB上找不到某些东西有关。我想知道他们的解决方案是否能帮助您:
解决方案是在目标的“Build settings”“Runpath Search Paths”字段中添加“$(CONFIGURATION_BUILD_DIR)”。

能否请在这个问题上给所有答案投反对票的人提供一个理由? - Dennis
1
他们可能会降低他们的评分。非常感谢您的答案!即使在2020年也有所帮助 :) - Cemen
堆叠。这对我有用(Xcode 12),而最高评价的“use_frameworks!”答案将在我的项目中使用Pods时带来很多麻烦。 - Chris Pointon

3

我曾在没有使用CocoaPods的项目中遇到了同样的问题,这个问题与自定义的IBDesignable视图有关。显然,这是一个Xcode的bug。以下步骤在这篇答案中帮助我解决了问题。简述如下:

  1. 退出Xcode。
  2. 关闭你的机器上所有名为Interface Builder Cocoa Touch Tool的进程。
  3. 重新启动Xcode。

2
问题在于当界面构建器渲染视图时,来自cocoapods的IB_DESIGNABLE没有正确链接。使用use_frameworks!技巧应该可以解决问题,但对我来说,迁移代码需要付出太多努力。我的技巧是在Storyboard中使用的每个来自pods的IB_DESIGNABLE视图都进行子类化,这样就解决了错误。

2
这个问题在最新版本的Cocoapods中已经修复。
要安装,只需运行以下命令:
[sudo] gem install cocoapods --pre

为了解决错误:“无法从路径(null)加载设计元素”:
use_frameworks!

   pod '****'



end

在你的Podfile文件中加入use_frameworks!

了解更多:如何从pod依赖项中使用IB_DESIGNABLE实时渲染自定义组件


1
有一个非常方便的技巧,可以用来调试实时渲染。
1) 将此扩展添加到您的项目中:
    extension UIView {
    public func liveDebugLog(message: String) {
        #if !(TARGET_OS_IPHONE)
            let logPath = "/tmp/XcodeLiveRendering.log"
            if !NSFileManager.defaultManager().fileExistsAtPath(logPath) {
                NSFileManager.defaultManager().createFileAtPath(logPath, contents: NSData(), attributes: nil)
            }

            var fileHandle = NSFileHandle(forWritingAtPath: logPath)
            fileHandle.seekToEndOfFile()

            let date = NSDate()
            let bundle = NSBundle(forClass: self.dynamicType)
            let application: AnyObject = bundle.objectForInfoDictionaryKey("CFBundleName")
            let data = "\(date) \(application) \(message)\n".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
            fileHandle.writeData(data)
        #endif
    }
  }

2) 添加一个 liveDebugLog(message:),并放置您想要知道的任何内容。 3) 打开 Terminal.app 并运行命令 open /tmp/XcodeLiveRendering.log

完成!

感谢 Morten Bøgh 的贡献。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接