22

我有一个用varUIButton实现的简单子类:IBDesignableIBInspectable

@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没有这些错误的情况下针对类进行测试?

4

6 回答 6

19

起初,我认为这是 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 使用当前模块。

Interface Builder 选择主要目标模块

于 2014-09-26T11:35:55.540 回答
15

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

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

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

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

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

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

在这些步骤之后,我能够毫无问题地继续我的项目。

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

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

于 2015-03-01T08:17:43.673 回答
3

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

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

在此处输入图像描述

相反,这样做:

在此处输入图像描述

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

在此处输入图像描述

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

于 2015-06-26T12:23:02.547 回答
2

这是什么原因造成的?

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

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

我怎样才能防止这种情况发生?

任何一个:

  1. 不要包含包含@IBDesignable或包含@IBInspectable在您的测试目标中的文件。(如果您只是测试几个独立的模型文件,它们可以保留为您的测试目标的成员。)
  2. 从测试目标中删除所有应用程序的文件(如Bartłomiej 的回答中所示),并将应用程序的模块导入测试文件(例如@testable import MyApp—<a href="https://stackoverflow.com/a/34605030/2680007" >请参阅此处了解更多详细信息。)这是最佳实践,允许您继续测试可设计/可检查的视图以及应用程序中的任何模型代码。

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

这个错误令人讨厌的是,一旦问题得到解决,它就不会自动消失,这可能是因为 IB 可能正在缓存一些东西,正如Gerd 在他的回答中所建议的那样

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

于 2016-01-05T07:02:42.900 回答
1

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

于 2015-09-25T13:49:49.877 回答
0

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

于 2016-04-29T17:10:37.833 回答