添加到testing目标时的IB可设置错误

我有一个简单的UIButton子类实现IBDesignableIBInspectable VAR:

 @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 

如果我删除IBDesignableIBInspectablevariables,错误消失 – 不幸的是,在界面生成器中的实时渲染也是如此。

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

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

步骤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步

从“testing”模块中导入您的应用程序模块。

例如,假设您的应用程序名为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”添加到“testing”目标。

STEP 3 (Swift)

在故事板中,显式select模块MyGreatApp,而不是让Xcode使用当前模块。

Interface Builder选择主要目标模块

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

这是为我工作的解决方法:

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

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

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

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

经过这一步,我能够继续我的项目没有任何问题。

我的理论是为什么这个工作原理是,当你做一个Project – > Clean时,界面构build器会caching一些不会被删除的东西(并在以后重build)。

另一个答案(导入您的主模块到您的testing模块)是一个好主意,并在过去解决了一些讨厌的问题,但不是这个。

解决scheme非常简单。 您需要删除您的testing目标,并从头开始再次创build它。 当我把项目移到Xcode 7时,我得到了一个警告,说我的testing目标已经损坏。 所以我决定再次设置它。 有效!

此外,你不附加你的故事板,甚至没有任何类到你的testing目标。 请不要这样做:

在这里输入图像说明

相反,这样做:

在这里输入图像说明

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

在这里输入图像说明

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

这是什么原因造成的?

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

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

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

或者:

  1. 不要在testing目标中包含包含@IBDesignable@IBInspectable文件。 (如果您只是testing一些孤立的模型文件,它们可以保留testing目标的成员。)
  2. 从你的testing目标中删除所有应用程序的文件(如Bartłomiej的答案所示 ),而是将你的应用程序的模块导入到你的testing文件中 (例如@testable import MyApp – 这里有更多的细节 。) 这是最好的做法,让你继续testing您的可devise/可检视视图以及您的应用程序中的任何模型代码。

一旦它已经发生了,我怎么能解决它?

有这个错误的讨厌的事情是,一旦问题解决后它不会自动消失,这可能是因为IB可能会caching一些Gerd在他的回答中所暗示的东西。

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

我终于find了解决办法。 Juste在Build Settings /其他链接器标志下添加“-framework XCTest”到您的testing目标。

此问题也可能是由于testing目标中的视图类中包含任何类别或扩展引起的。