IBDesignable Errors When Adding to Tests Target

痞子三分冷 提交于 2019-11-28 20:26:49
rintaro

At first, I thought this was a kind of bug in Xcode. Following is the workaround I found:

STEP 1

Mark your class and properties as 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 }
    }
}

STEP 2

Import your application module from your "Tests" module.

For example, assuming that your application is named MyGreatApp, in your 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")
    }
}

You don't need to add 'Button.swift' to your "Tests" target.

STEP 3 (for Swift)

In your storyboard explicitly select the module MyGreatApp for any custom classes instead of letting Xcode use the current module.

Your question describes exactly the circumstances I experienced. The error is also visible in the attribute inspector under your own attributes.

This is the workaround that worked for me:

Step 1 remove all @IBDesignable and @IBInspectable from your source code

Step 2 Go back to the interface builder. The error is still there.

Step 3 Restart XCode, rebuild your project. Errors should be vanished.

Step 4 add all @IBDesignable and @IBInspectable again to your source code

After this steps I was able to go on with my project without any problems.

My theory why this works is that the interface builder caches some stuff that is not deleted (and rebuilt later) when you do a Project -> Clean.

The other answer (Importing your main module into your test module) is a good idea and solved some nasty problems for me in the past but not this one.

The solution is very simple. You need to remove your test target, and create it once again from the start. When I had moved the project to Xcode 7, I got an warning that my test target is damaged. So I decided to set it up once again. IT WORKED!.

Additionally you do not attach your storyboards and not even any class to your test target. Please do not do it like this:

Instead, do it this way:

So, simply remove any file from your test target (including classes with @IBDesignables), then If you need access to your classes within your test target just use @testable import MyApp:

It is working and every errors with IBDesignables will disappear. Enjoy:-)

George WS

What is causing this?

This error appears when two things happen:

  1. You include any file containing @IBDesignable or @IBInspectable in your test target.
  2. You open your .storyboard or .xib file (containing your designable/inspectable views).

How can I prevent this from happening?

Either:

  1. Don’t include files containing @IBDesignable or @IBInspectable in your test target. (If you’re just testing a few isolated model files, they can remain members of your test target.)
  2. Remove all of your app’s files from your test target (as illustrated in Bartłomiej's answer), and instead import your app’s module into your test file (e.g. @testable import MyAppsee here for more details.) This is the best practice, allowing you to continue testing your designable/inspectable views as well as any model code in your app.

How can I solve it once it's already happened?

The pesky thing with this error is that it doesn’t automatically go away once the problem has been solved, potentially because IB may be caching something as Gerd suggests in his answer.

What I’ve found is that once you’ve actually performed either of the two preventative measures I listed above, simply restarting Xcode (without modifying any code) should make the error go away.

I finally found the solution. Juste add "-framework XCTest" to your test target under Build Settings / other linker flags.

This issue can also be caused by including any categories or extensions on the view class in your test target.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!