ios swift xcode xctest ibdesignable

ios - Errores IBDesignables al agregar a la prueba de destino



swift xcode (6)

Tengo una subclase de UIButton simple que implementa IBDesignable con una var IBInspectable :

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

No estoy usando esto dentro de un marco y está funcionando en Interface Builder según lo previsto, sin embargo, una vez que agrego esta subclase a mi objetivo de Tests , deja de renderizar en vivo y recibo 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 las vars IBInspectable , los errores desaparecen; desafortunadamente, también lo hace la representación en vivo en Interface Builder.

¿Cómo puedo probar contra una clase IBDesignable sin estos errores?


Al principio, pensé que esto era una especie de error en Xcode. A continuación está la solución que encontré:

PASO 1

Marca tu clase y propiedades 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 módulo de aplicación desde su módulo "Pruebas".

Por ejemplo, suponiendo que su aplicación se llama MyGreatApp , en su 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") } }

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

PASO 3 (para Swift)

En su guión gráfico, seleccione explícitamente el módulo MyGreatApp para cualquier clase personalizada en lugar de permitir que Xcode use el módulo actual.


Este problema también puede deberse a la inclusión de categorías o extensiones en la clase de vista en su objetivo de prueba.


Finalmente encontré la solución. Juste agrega "-framework XCTest" a tu objetivo de prueba en Configuración de compilación / otros indicadores de vinculador.


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

Además, no adjunta sus guiones gráficos ni siquiera ninguna clase a su objetivo de prueba. Por favor no lo hagas así:

En su lugar, hazlo de esta manera:

Entonces, simplemente elimine cualquier archivo de su destino de prueba (incluidas las clases con @IBDesignables), luego, si necesita acceso a sus clases dentro de su destino de prueba, use @testable import MyApp :

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


Tu pregunta describe exactamente las circunstancias que experimenté. El error también es visible en el inspector de atributos bajo sus propios atributos.

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

Paso 1 elimine todos los códigos @IBDesignable y @IBInspectable de su código fuente

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

Paso 3 Reinicia XCode, reconstruye tu proyecto. Los errores deben desaparecer.

Paso 4 agregue todos los @IBDesignable y @IBInspectable de nuevo 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 generador de interfaces almacena en caché algunas cosas que no se eliminan (y se reconstruyen más adelante) cuando haces un Proyecto -> Limpiar.

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


¿Qué está causando esto?

Este error aparece cuando suceden dos cosas:

  1. Incluye cualquier archivo que contenga @IBDesignable o @IBInspectable en su objetivo de prueba .
  2. Abre su archivo .storyboard o .xib (que contiene sus vistas que se pueden diseñar / inspeccionar).

¿Cómo puedo evitar que esto suceda?

Ya sea:

  1. No incluya archivos que contengan @IBDesignable o @IBInspectable en su objetivo de prueba. (Si solo está probando algunos archivos de modelo aislados, pueden seguir siendo miembros de su objetivo de prueba).
  2. Elimine todos los archivos de su aplicación de su objetivo de prueba (como se ilustra en la respuesta de BartÅ‚omiej ), e importe el módulo de su aplicación en su archivo de prueba (por ejemplo, @testable import MyApp - vea aquí para obtener más detalles ). Esta es la mejor práctica, permitiéndole para continuar probando sus vistas designables / inspeccionables, así como cualquier código de modelo en su aplicación.

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

Lo molesto de este error es que no desaparece automáticamente una vez que se resuelve el problema, posiblemente porque IB puede estar almacenando algo en caché como sugiere Gerd en su respuesta .

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