添加到testing目标时的IB可设置错误
我有一个简单的UIButton
子类实现IBDesignable
与IBInspectable
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
如果我删除IBDesignable
和IBInspectable
variables,错误消失 – 不幸的是,在界面生成器中的实时渲染也是如此。
如何在没有这些错误的情况下对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使用当前模块。
你的问题描述了我所经历的情况。 在属性检查器中,您的属性也会显示错误。
这是为我工作的解决方法:
第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的每个错误都将消失。 请享用:-)
这是什么原因造成的?
发生两件事情时会出现此错误:
- 您在testing目标中包含任何包含
@IBDesignable
或@IBInspectable
文件。 - 您打开.storyboard或.xib文件(包含您的可devise/可检视的视图)。
我怎样才能防止这种情况发生?
或者:
- 不要在testing目标中包含包含
@IBDesignable
或@IBInspectable
文件。 (如果您只是testing一些孤立的模型文件,它们可以保留testing目标的成员。) - 从你的testing目标中删除所有应用程序的文件(如Bartłomiej的答案所示 ),而是将你的应用程序的模块导入到你的testing文件中 (例如
@testable import MyApp
– 这里有更多的细节 。) 这是最好的做法,让你继续testing您的可devise/可检视视图以及您的应用程序中的任何模型代码。
一旦它已经发生了,我怎么能解决它?
有这个错误的讨厌的事情是,一旦问题解决后它不会自动消失,这可能是因为IB可能会caching一些Gerd在他的回答中所暗示的东西。
我发现,一旦实际执行了上面列出的两种预防性措施之一,只需重新启动Xcode(不修改任何代码)就可以使错误消失。
我终于find了解决办法。 Juste在Build Settings /其他链接器标志下添加“-framework XCTest”到您的testing目标。
此问题也可能是由于testing目标中的视图类中包含任何类别或扩展引起的。