添加到测试目标时的IBDesignable错误

时间:2014-09-25 05:09:01

标签: ios swift xcode xctest ibdesignable

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

@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 vars,错误就会消失 - 不幸的是,Interface Builder中的实时渲染也是如此。

如何在没有这些错误的情况下对IBDesignable类进行测试?

6 个答案:

答案 0 :(得分:17)

起初,我认为这是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步

从您的" Tests"导入您的应用程序模块模块。

例如,假设您的应用程序名为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使用当前模块。

Interface Builder select main target module

答案 1 :(得分:15)

您的问题完全描述了我所经历的情况。 在您自己的属性下,属性检查器中也会显示该错误。

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

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

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

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

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

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

我的理论为什么这样做是因为界面构建器缓存了一些在执行项目时未被删除(并在以后重建)的东西 - >干净。

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

答案 2 :(得分:3)

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

此外,您不会将故事板,甚至任何课程都附加到您的测试目标。请不要这样做:

enter image description here

相反,这样做:

enter image description here

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

enter image description here

它正在运行,IBDesignables的每个错误都将消失。享受: - )

答案 3 :(得分:2)

造成这种情况的原因是什么?

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

  1. 您的测试目标中包含valac --pkg gee-0.8 -g tests.vala arrayhashmap.vala @IBDesignable的任何文件。
  2. 您打开.storyboard或.xib文件(包含可设计/可检查的视图)。
  3. 如何防止这种情况发生?

    或者:

    1. 不要在测试目标中包含包含@IBInspectable@IBDesignable的文件。 (如果您只是测试一些隔离的模型文件,它们仍然可以成为测试目标的成员。)
    2. 从测试目标中移除所有应用的文件(如Bartłomiej's answer所示),然后将应用的模块导入测试文件(例如@IBInspectable - { {3}}。)这是最佳做法,允许您继续测试可设计/可检查的视图以及应用中的任何模型代码。
    3. 如果已经发生,我该如何解决?

      这个错误的令人讨厌的事情是,一旦问题解决了它就不会自动消失,可能是因为IB可能正在缓存see here for more details

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

答案 4 :(得分:1)

我终于找到了解决方案。 Juste在Build Settings /其他链接器标志下为您的测试目标添加“-framework XCTest”。

答案 5 :(得分:0)

此问题也可能是因为在测试目标中的视图类中包含任何类别或扩展名。