Errores IBDesignable al agregar a las testings objective

Tengo una subclass UIButton simple que implementa IBDesignable con una IBInspectable var:

 @IBDesignable class Button: UIButton { @IBInspectable var borderColor: UIColor = UIColor.whiteColor() { didSet { layer.borderColor = borderColor.CGColor } } } 

No utilizo esto dentro de un marco y funciona en Interface Builder según lo previsto, sin embargo, una vez que agrego esta subclass a mi objective de Tests , deja de renderizar en vivo y obtengo los siguientes errores:

 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 

Si IBDesignable y el IBInspectable vars, los errores desaparecerán, desafortunadamente también lo hará la representación en vivo en Interface Builder.

¿Cómo IBDesignable contra una class IBDesignable sin estos errores?

Al principio, pensé que esto era un tipo de error en Xcode. La siguiente es la solución que encontré:

PASO 1

Marca tu class y properties como 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 } } } 

PASO 2

Importe su module de aplicación desde su module "Pruebas".

Por ejemplo, suponiendo que su aplicación se denomina MyGreatApp , en su MyGreatAppTests/MyGreatAppTests.swift :

 import UIKit import XCTest import MyGreatApp class MyGreatAppTests: XCTestCase { func testExample() { let btn = Button() btn.borderColor = UIColor.networkingColor() XCTAssertEqual(UIColor(CGColor:btn.layer.borderColor), UIColor.networkingColor(), "borderColor") } } 

No es necesario que agregue 'Button.swift' a su objective de "Pruebas".

PASO 3 (para Swift)

En su guión gráfico, select explícitamente el module MyGreatApp para cualquier class personalizada en lugar de dejar que Xcode use el module actual.

Interface Builder seleccione el módulo de destino principal

Su pregunta describe exactamente las circunstancias que experimenté. El error también está visible en el inspector de attributes bajo sus propios attributes.

Esta es la solución que funcionó para mí:

Paso 1 elimine todo @IBDesignable y @IBInspectable de su código fuente

Paso 2 Regrese al generador de interfaces. El error sigue ahí.

Paso 3 Reinicie XCode, reconstruya su proyecto. Los errores deben desaparecer.

Paso 4: agregue todos @IBDesignable y @IBInspectable nuevamente a su código fuente

Después de estos pasos pude continuar con mi proyecto sin ningún problema.

Mi teoría de por qué esto funciona es que el constructor de la interfaz almacena en caching algunas cosas que no se borran (y se reconstruyen más adelante) cuando haces un Proyecto -> Limpiar.

La otra respuesta (Importar su module principal en su module de testing) es una buena idea y resolvió algunos problemas desagradables para mí en el pasado, pero no este.

La solución es muy simple. Debe eliminar su objective de testing y crearlo una vez más desde el principio. Cuando moví el proyecto a Xcode 7, recibí una advertencia de que mi objective de testing está dañado. Así que decidí configurarlo una vez más. ¡FUNCIONÓ! .

Además, no adjuntar sus storyboards ni siquiera ninguna class a su objective de testing. Por favor, no lo hagas así:

introduzca la descripción de la imagen aquí

En cambio, hágalo de esta manera:

introduzca la descripción de la imagen aquí

Por lo tanto, simplemente elimine cualquier file de su objective de testing (incluidas las classs con @IBDesignables), luego, si necesita acceder a sus classs dentro de su objective de testing, simplemente use @testable import MyApp :

introduzca la descripción de la imagen aquí

Está funcionando y todos los errores con IBDesignables desaparecerán. Disfrutar:-)

¿Qué está causando esto?

Este error aparece cuando ocurren dos cosas:

  1. Incluye cualquier file que contenga @IBDesignable o @IBInspectable en su objective de testing .
  2. Abre su file .storyboard o .xib (que contiene sus vistas designables / inspeccionables).

¿Cómo puedo evitar que esto suceda?

Ya sea:

  1. No incluya files que contengan @IBDesignable o @IBInspectable en su objective de testing. (Si solo está probando algunos files de model aislados, pueden seguir siendo miembros de su objective de testing).
  2. Elimine todos los files de su aplicación de su objective de testing (como se ilustra en la respuesta de Bartłomiej ) y, en su lugar, importe el module de su aplicación en su file de testing (por ejemplo, @testable import MyApp ; consulte aquí para get más información ). Esta es la mejor práctica que le permite para continuar probando sus vistas designables / inspeccionables, así como cualquier código de model en su aplicación.

¿Cómo puedo solucionarlo una vez que ya pasó?

Lo molesto con este error es que no desaparece automáticamente una vez que se ha resuelto el problema, potencialmente porque IB puede estar almacenando algo como lo sugiere Gerd en su respuesta .

Lo que he encontrado es que una vez que hayas realizado cualquiera de las dos medidas preventivas que mencioné anteriormente, simplemente reiniciar Xcode (sin modificar ningún código) debería hacer que el error desaparezca.

Finalmente encontré la solución. Juste agregue "-framework XCTest" a su objective de testing en Configuraciones de compilation / otros indicadores del linker.

Este problema también puede deberse a la inclusión de categorías o extensiones en la class de vista en su objective de testing.