【问题标题】:IBDesignable Errors When Adding to Tests Target添加到测试目标时的 IBDesignable 错误
【发布时间】:2014-11-19 18:37:38
【问题描述】:

我有一个简单的UIButton 子类,它使用IBInspectable var 实现IBDesignable

@IBDesignable class Button: UIButton {
    @IBInspectable var borderColor: UIColor = UIColor.whiteColor() {
        didSet { layer.borderColor = borderColor.CGColor }
    }
}

我没有在框架中使用它,它在 Interface Builder 中按预期工作,但是,一旦我将此子类添加到我的 Tests 目标中,它就会停止实时渲染,并且出现以下错误:

Main.storyboard: error: IB Designables: Failed to update auto layout status: dlopen(TestTests.xctest, 1): Library not loaded: @rpath/XCTest.framework/XCTest
Referenced from: TestTests.xctest
Reason: image not found

Main.storyboard: error: IB Designables: Failed to render instance of Button: dlopen(TestTests.xctest, 1): Library not loaded: @rpath/XCTest.framework/XCTest
Referenced from: TestTests.xctest
Reason: image not found

如果我删除 IBDesignableIBInspectable 变量,错误就会消失 - 不幸的是,Interface Builder 中的实时渲染也是如此。

如何针对IBDesignable 类进行测试而不出现这些错误?

【问题讨论】:

  • 有机会发到github吗?
  • 当我的 UIView 子类在 Cocoapod 中实现时,我遇到了这样的错误。将 UIView 类移动到主应用程序使其工作。

标签: ios swift xcode xctest ibdesignable


【解决方案1】:

您的问题准确地描述了我所经历的情况。 该错误在您自己的属性下的属性检查器中也可见。

这是对我有用的解决方法:

第 1 步 从源代码中删除所有 @IBDesignable 和 @IBInspectable

第 2 步 返回界面生成器。错误仍然存​​在。

第 3 步 重启 XCode,重建你的项目。 错误应该消失。

第 4 步 将所有 @IBDesignable 和 @IBInspectable 再次添加到您的源代码中

完成这些步骤后,我可以毫无问题地继续我的项目。

我认为这可行的原因是界面构建器缓存了一些在您执行项目 -> 清理时未删除(并稍后重建)的内容。

另一个答案(将您的主模块导入您的测试模块)是一个好主意,过去为我解决了一些令人讨厌的问题,但不是这个。

【讨论】:

  • 除了清理之外,您是否尝试过手动删除 Derived Data 文件夹以清除错误?
  • 不能再检查这个了,因为我不知道怎么故意制造这个问题。
  • 我遇到了这个问题,删除了派生数据,但错误仍然存​​在。然后我按照 Gerd 的指示,错误消失了。我同意 Gerd 的理论,即 IB 将未清理的东西缓存在某个地方,现在补充说它也在派生数据之外的某个地方。如果有人知道 IB 在哪里缓存东西,请告诉我们,这样我们就可以在这种情况下直接删除它! :)
  • 您可能还需要删除 ~/Library/Caches/com.apple.dt.Xcode 查看此链接以获取更多详细信息stackoverflow.com/a/6247073/539149 我建议将符号链接保存到此类常见位置或编写一个 AppleScript 或删除它们的 shell 脚本。
  • 也为我工作。谢谢。
【解决方案2】:

此问题也可能是由于在测试目标中的视图类中包含任何类别或扩展而导致的。

【讨论】:

    【解决方案3】:

    是什么原因造成的?

    当发生两件事时会出现此错误:

    1. 您在测试目标中包含任何包含@IBDesignable@IBInspectable 的文件。
    2. 您打开 .storyboard 或 .xib 文件(包含可设计/可检查的视图)。

    如何防止这种情况发生?

    任一:

    1. 不要在测试目标中包含包含@IBDesignable@IBInspectable 的文件。 (如果您只是测试几个独立的模型文件,它们可以保留为您的测试目标的成员。)
    2. 从您的测试目标中删除您应用的所有文件(如Bartłomiej's answer 所示),改为将您应用的模块导入您的测试文件(例如@testable import MyAppsee here for more details。) 这是最佳做法,可让您继续测试可设计/可检查的视图以及应用中的任何模型代码。

    一旦发生,我该如何解决?

    这个错误令人讨厌的是,一旦问题得到解决,它就不会自动消失,可能是因为 IB 可能将某些内容缓存为Gerd suggests in his answer

    我发现,一旦您实际执行了我上面列出的两种预防措施中的任何一种,只需重新启动 Xcode(不修改任何代码)即可消除错误。

    【讨论】:

      【解决方案4】:

      我终于找到了解决办法。只需在构建设置/其他链接器标志下将“-framework XCTest”添加到您的测试目标。

      【讨论】:

        【解决方案5】:

        解决方案非常简单。您需要删除您的测试目标,并从头开始重新创建它。当我将项目移动到 Xcode 7 时,我收到一个警告,说我的测试目标已损坏。所以我决定重新设置它。 成功了!

        此外,您没有将情节提要甚至任何课程附加到您的测试目标。请不要这样做:

        相反,这样做:

        因此,只需从测试目标中删除任何文件(包括带有@IBDesignables 的类),然后如果您需要访问测试目标中的类,只需使用@testable import MyApp

        它正在工作,IBDesignables 的每个错误都会消失。享受:-)

        【讨论】:

          【解决方案6】:

          起初,我认为这是 Xcode 中的一种错误。以下是我找到的解决方法:

          第 1 步

          将您的类和属性标记为public

          @IBDesignable public class Button: UIButton {
              @IBInspectable public var borderColor: UIColor = UIColor.whiteColor() {
                  didSet { layer.borderColor = borderColor.CGColor }
              }
          
              @IBInspectable public var borderWidth:CGFloat = 0.0 {
                  didSet { layer.borderWidth = borderWidth }
              }
          }
          

          第 2 步

          从“测试”模块导入您的应用程序模块。

          例如,假设您的应用程序名为MyGreatApp,则在您的MyGreatAppTests/MyGreatAppTests.swift

          import UIKit
          import XCTest
          import MyGreatApp
          
          class MyGreatAppTests: XCTestCase {
          
              func testExample() {
                  let btn = Button()
                  btn.borderColor = UIColor.redColor()
                  XCTAssertEqual(UIColor(CGColor:btn.layer.borderColor), UIColor.redColor(), "borderColor")
              }
          }
          

          您无需将“Button.swift”添加到您的“测试”目标中。

          第 3 步(适用于 Swift)

          在您的故事板中,为任何自定义类明确选择模块 MyGreatApp,而不是让 Xcode 使用当前模块。

          【讨论】:

          • 向类或变量添加 public 并不能解决问题。重新启动 Xcode 总是清除错误,直到我重新打开情节提要。
          • 好的,我确认这并不能解决问题。对此感到抱歉。我编辑了答案。
          • 以防万一你没看到这个stackoverflow.com/questions/24994593/…
          • 感谢您的信息。我对你的建议有些意见。除了将类和变量声明为公共之外,最终使它起作用的一件事是选择我的故事板中使用的任何类的模块与我的主要目标相同 - 否则 Xcode 正在使用活动目标,当我中断时使用 Test 目标进行测试。
          • 不幸的是,它对我不起作用:-(我仍然有同样的错误
          猜你喜欢
          • 2013-09-29
          • 1970-01-01
          • 1970-01-01
          • 2013-07-24
          • 2021-05-31
          • 2015-03-13
          • 2018-12-30
          • 1970-01-01
          • 2018-10-20
          相关资源
          最近更新 更多