我有一个简单的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
如果删除IBDesignable
和IBInspectable
vars,错误就会消失 - 不幸的是,Interface Builder中的实时渲染也是如此。
如何在没有这些错误的情况下对IBDesignable
类进行测试?
答案 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使用当前模块。
答案 1 :(得分:15)
您的问题完全描述了我所经历的情况。 在您自己的属性下,属性检查器中也会显示该错误。
这是对我有用的解决方法:
第1步 从源代码中删除所有@IBDesignable和@IBInspectable
第2步 返回界面构建器。错误仍然存在。
第3步 重新启动XCode,重建项目。 错误应该消失。
第4步 将所有@IBDesignable和@IBInspectable再次添加到源代码
完成这些步骤后,我可以毫无问题地继续我的项目。
我的理论为什么这样做是因为界面构建器缓存了一些在执行项目时未被删除(并在以后重建)的东西 - >干净。
另一个答案(将主模块导入测试模块)是一个好主意,过去解决了一些令我讨厌的问题,但不是这个问题。
答案 2 :(得分:3)
解决方案非常简单。您需要删除测试目标,并从头开始再次创建它。当我将项目移动到Xcode 7时,我收到一条警告,说我的测试目标已损坏。所以我决定再次设置它。 IT工作!。
此外,您不会将故事板,甚至任何课程都附加到您的测试目标。请不要这样做:
相反,这样做:
因此,只需从测试目标中删除任何文件(包括带有@IBDesignables的类),然后如果您需要访问测试目标中的类,只需使用@testable import MyApp
:
它正在运行,IBDesignables的每个错误都将消失。享受: - )
答案 3 :(得分:2)
造成这种情况的原因是什么?
发生两件事时会出现此错误:
valac --pkg gee-0.8 -g tests.vala arrayhashmap.vala
或@IBDesignable
的任何文件。如何防止这种情况发生?
或者:
@IBInspectable
或@IBDesignable
的文件。 (如果您只是测试一些隔离的模型文件,它们仍然可以成为测试目标的成员。)@IBInspectable
- { {3}}。)这是最佳做法,允许您继续测试可设计/可检查的视图以及应用中的任何模型代码。 如果已经发生,我该如何解决?
这个错误的令人讨厌的事情是,一旦问题解决了它就不会自动消失,可能是因为IB可能正在缓存see here for more details。
我发现,一旦你实际执行了我在上面列出的两种预防措施中的任何一种,只需重新启动Xcode(不修改任何代码)就可以使错误消失。
答案 4 :(得分:1)
我终于找到了解决方案。 Juste在Build Settings /其他链接器标志下为您的测试目标添加“-framework XCTest”。
答案 5 :(得分:0)
此问题也可能是因为在测试目标中的视图类中包含任何类别或扩展名。