IB_DESIGNABLE, IBInspectable: el generador de interfaz no se actualiza

Tengo el siguiente conjunto de código:

CustomView.h

#import  IB_DESIGNABLE @interface CustomView : UIView @property (nonatomic) IBInspectable UIColor *borderColor; @property (nonatomic) IBInspectable CGFloat borderWidth; @property (nonatomic) IBInspectable CGFloat cornerRadius; @end 

CustomView.m

 #import "CustomView.h" @implementation CustomView - (void)setBorderColor:(UIColor *)borderColor { _borderColor = borderColor; self.layer.borderColor = borderColor.CGColor; } - (void)setBorderWidth:(CGFloat)borderWidth { _borderWidth = borderWidth; self.layer.borderWidth = borderWidth; } - (void)setCornerRadius:(CGFloat)cornerRadius { _cornerRadius = cornerRadius; self.layer.cornerRadius = cornerRadius; } @end 

(Para referencia de Swift, este problema también estaba ocurriendo con el código Swift)

CustomView.swift

 @IBDesignable class CustomView : UIView { override init(frame: CGRect) { super.init(frame: frame) } required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } @IBInspectable var borderColor : UIColor = UIColor.clearColor() { didSet { self.layer.borderColor = borderColor.CGColor } } @IBInspectable var borderWidth : CGFloat = 0.0 { didSet { self.layer.borderWidth = borderWidth } } @IBInspectable var cornerRadius : CGFloat = 0.0 { didSet { self.layer.cornerRadius = cornerRadius } } } 

UIView un UIView a un controlador de vista en el guión gráfico y configuré su subclase en CustomView .

enter image description here

Esto agrega la fila “Designables”. Está bloqueado en “Actualización” y la información sobre herramientas dice “Esperando el objective para comstackr”. Nunca cambia de este estado.

Cuando me IBInspectable a los atributos inspeccionar, puedo establecer estas propiedades IBInspectable :

enter image description here

Y una vez configurados, también aparecen en los “Atributos de tiempo de ejecución definidos por el usuario”:

enter image description here

Sin embargo, el estado “Designables” nunca va más allá de “Actualizar” con la misma información sobre herramientas (he intentado construir Cmd + B varias veces, nada cambia).

Además, cuando configuro las propiedades IBInspectable , recibo una advertencia para cada una:

IBDesignables – Ignorando el atributo de tiempo de ejecución definido por el usuario para la ruta de la clave “borderColor” en la instancia de “UIView” … esta clase no es un valor clave que cumple con la encoding para la clave borderColor.

Captura de pantalla de las advertencias generadas:

enter image description here


Estoy familiarizado con los problemas que cumplen con la encoding de valores-clave y, en general, sé cómo resolverlos … pero no entiendo cómo resolver este problema aquí. De acuerdo con el inspector de identidad de la vista, la vista es una “Vista personalizada” (no una “UIView” regular, que no tiene estas propiedades). Y si la vista no fuera una “Vista personalizada”, estas propiedades designables no aparecerían en el Inspector de atributos, ¿verdad? Pero cuando Interface Builder intenta aplicar estos atributos a la vista, vuelve a pensar que la clase de la vista es “UIView” y no puede aplicar los atributos.

¿Alguna ayuda? Por favor, avíseme si he omitido algunos detalles importantes, pero por lo que vale, seguí este tutorial exactamente (aparte de ObjC vs Swift). También vale la pena señalar que seguí este tutorial exactamente en otra máquina y funcionó a las mil maravillas (tenía la intención de hacer esta publicación anoche, pero la computadora en la que estaba entonces no tenía este problema).


En función de los comentarios, se ha sugerido que quizás el archivo .m no esté incluido y que pueda estar causando el problema. Pensé que sin duda habría salido de mi camino para que este escenario fuera el caso, pero lo verifiqué de todos modos.

enter image description here

Cuando comencé a intentar hacer esto, entendí que las clases IB_DESIGNABLE tenían que ser parte de un marco de UIKit diferente. Entonces, desde esta primera captura de pantalla, puede ver que configuré un marco “CustomViews”, que tiene una clase, CustomView . También verá aquí que también creé un OtherView , que es idéntico a CustomView , excepto que no está en un marco separado. Sin embargo, el problema idéntico persiste en el guión gráfico entre ambas clases.

Aquí tenemos una captura de pantalla que indica que CustomView.m se incluye para CustomViews con el marco CustomViews :

enter image description here

Mientras tanto, la siguiente captura de pantalla indica varias cosas:

  • CustomViews.framework está apropiadamente incluido en el proyecto principal.
  • OtherView.m también se incluye como fuente de comstackción, por lo que incluso si algo está mal con CustomView , OtherView debería funcionar, sin embargo, genera errores idénticos.
  • Main.storyboard y LaunchScreen.xib se muestran en rojo. No tengo ni idea de por qué, y no tengo la menor idea de por qué LaunchScreen.xib debería (no he tocado este archivo), aunque puedo decir que después de mirar otros proyectos, Main.storyboard también aparece en rojo para aquellos proyectos, y no estoy haciendo nada con IB_DESIGNABLE o IBInspectable allí.

enter image description here


He intentado y vuelto a intentar esto varias veces ahora. Funciona siempre en mi computadora en casa: no puedo reproducir el problema descrito en esta pregunta en casa. En el trabajo, nunca funciona. El problema que se describe en esta pregunta ocurre siempre.

Ambas computadoras son Mac Minis compradas nuevas este año (no los modelos nuevos, modelo de finales de 2012). Ambas computadoras ejecutan OS X Yosemite 10.10. Ambas computadoras ejecutan Xcode versión 6.1. En casa, la construcción es (6A1052d). Esta mañana, puedo confirmar que ambas computadoras están ejecutando versiones idénticas de Xcode.

Otros me han sugerido que podría ser una mala RAM. Eso me parece descabellado. He reiniciado el proyecto varias veces, reinicié la computadora varias veces. Me parece que si hubiera una RAM mala en una computadora de aproximadamente 6 meses, estaría viendo otros problemas y que este problema sería menos consistente. Pero este problema exacto persiste a pesar de que muchas veces reinició todo el proyecto desde cero y reinicios completos en la computadora.


Vale la pena señalar que si realmente compilo y ejecuto este proyecto, la vista personalizada con las propiedades IBInspectable realmente se muestra como espero que el guión gráfico lo muestre. Imagino que este sería el caso incluso sin las directivas IB_DESIGNABLE e IBInspectable , ya que se crean como Atributos de tiempo de ejecución definidos por el usuario.

Basándome en la sugerencia de chrisco para depurar la vista seleccionada (que ya había hecho, pero volví a intentarlo de nuevo), noté algunas otras opciones en la parte inferior del menú Editor.

  • Actualizar automáticamente las vistas
  • Actualizar todas las vistas

Hice clic en “Actualizar todas las vistas” y después de pensar un poco en Xcode, de repente el guión gráfico mostraba mi vista como se esperaba (aplicando correctamente mis propiedades IBInspectable ).

enter image description here

Luego revisé todo el proceso nuevamente para confirmar que esta es la solución.

ThirdView una nueva clase, ThirdView . Esta clase es idéntica a las otras, de nuevo. Cambié la clase de mi vista a ThirdView y obtuve algo ligeramente diferente esta vez:

enter image description here

Al hacer clic en “Mostrar” para ver las advertencias:

enter image description here

Una nueva esta vez:

Usando la clase UIView para el objeto con clase personalizada porque la clase ThirdView no existe.

Esto realmente no es más útil que lo que ya existía. Además, ahora las otras tres advertencias se han duplicado en 6 de forma extraña.

De todos modos, si vuelvo a hacer clic en “Actualizar todas las vistas” en el menú desplegable del Editor, todos los errores desaparecen, y una vez más, la vista se muestra correctamente.

Aún así, hasta este punto, todo lo que hice fue algo con lo que nunca me metí en casa. En casa, simplemente funcionó. Así que activé “Actualizar automáticamente las vistas” y creé una “Cuarta vista” para probar, una vez más, idéntica a las tres primeras.

Después de cambiar la clase de la vista a “FourthView”, la etiqueta designables dijo “Actualización” por un breve momento y finalmente dijo “Actualizada”:

enter image description here

Entonces, revisé mi computadora en casa. “Actualizar automáticamente vistas” está activado en la computadora que siempre estuvo funcionando. Fue apagado en la computadora que no estaba. No recuerdo tocar esta opción de menú. Ni siquiera puedo decirte con certeza si existía antes de Xcode 6. Pero esta opción es lo que marcó la diferencia.


TL; DR, si tiene el mismo problema descrito en la pregunta, asegúrese de que esté activada la opción “Actualizar automáticamente vistas” (o “Actualizar todas las vistas” manualmente cuando necesite una actualización en IB):

enter image description here

Solo una sugerencia rápida para que alguien más tenga este problema: recuerde especificar el tipo de la variable.

 // Doesn't show up in IB @IBInspectable var includeLeftSection = true // Shows now that it knows the type @IBInspectable var includeLeftSection : Bool = true 

Tengo algunos detalles más que pueden causar que sus clases IBDesignable no se carguen.

Seleccione su storyboard / xib problemático donde deberían mostrarse sus vistas personalizadas.

En el área del navegador, vaya al Navegador de informes en su espacio de trabajo / proyecto XCode.

En el menú Editor de XCode, presione (como lo menciona nhgrif) la opción “Actualizar todas las vistas”. Esto hará que IB inicie una comstackción para un montón de cosas que, estoy seguro, no esperaría.

En Report Navigator, haga clic en “By Group” para filtrar el contenido y consulte la sección “Interface Builder”. Verá que, para cargar el marco personalizado de vistas IBDesignable, comstackrá MUCHAS cosas. Si alguno de estos objectives NO se comstack, como objectives de prueba unitarios (quizás obsoletos) (incluso si no están relacionados con el código que carga estas vistas o el guión gráfico), IB no podrá cargar su dll.

En mi caso, IB intentó comstackr 8 objectives, incluidos 4 que eran pruebas unitarias que no se habían actualizado desde los recientes cambios de refactorización en los que hemos estado trabajando.

La mayoría de los cambios / correcciones de código que he realizado para que IB cargue y muestre mis vistas de aduana correctamente no están relacionadas o incluso vinculadas con estas clases, ni cargará nunca el guión gráfico en el curso de la ejecución de estas pruebas unitarias. Sin embargo, IB tenía una dependencia de todo el espacio de trabajo comstackdo para que funcione.

Tuve la misma advertencia de Ignoring user defined runtime attribute for key path .. aunque estoy absolutamente seguro de que no hice nada incorrecto con mi clase de vista IBDesignable personalizada.

Resultó, en mi caso, tiene que ver con la memoria caché de Xcode.

 rm -rf ~/Library/Developer/Xcode/DerivedData/* 

Purge DerivedData y la advertencia se ha ido.

En caso de que alguien más se encuentre con el error, la clase IB Designables no existe, por el mismo motivo que yo. La respuesta principal no era mi problema … pero aquí hay un problema levemente relacionado …

Hay una propiedad escondida en el código fuente del storyboard llamado customModule.

Por ejemplo, tuve una clase llamada ForwardArrow dentro de un marco separado que agregué accidentalmente a mi objective principal.

Entonces el XML para algunas vistas terminó como customClass = “ForwardArrow” customModule = “MainTargetNameWasHere”

Cuando los quité del objective principal en la comstackción, el guión gráfico no actualizó MainTargetNameWasHere a CustomViews, que es el marco donde estaba ubicado y comenzó a dar ese error de clase no encontrada.

Entonces TLDR; Asegúrese de que si su IBDesignable se encuentra en otro marco, el atributo xModule personalizado de su panel de historia se establece en el valor correcto. Y si no está allí, agrégalo.

Ejemplo de mi fuente:

  

Personalmente, resolví este problema usando el botón “-” para eliminar contenido de mi inspector de identidad. Cuando eliminas las clases personalizadas, cambias el contenido en el IB y luego agregas una nueva clase personalizada, los elementos identificables en el inspector de identidad no se eliminan y me causaba ese error. Simplemente elimine todo y reconstruya. enter image description here

Como mi ejemplo, estaba usando CheckboxButton a través de pod y los gráficos de la checkbox nunca aparecen en el guión gráfico, mientras que tengo los mismos problemas que se describen en la pregunta aquí:

warning: IB Designables: Usar la clase UIView para el objeto con clase personalizada porque la clase CheckboxButton no existe

y

warning: IB Designables: Ignorar el atributo de tiempo de ejecución definido por el usuario para la ruta clave “checkColor” en la instancia de “UIView”. Haga clic en una excepción cuando intente establecer su valor: [setValue: forUndefinedKey:]: esta clase no es un valor clave que cumpla con la encoding para la clave checkColor.

La forma en que resolvió mi problema fue suministrar el módulo con el nombre CheckboxButton como se muestra a continuación:

Nota: debe reemplazar CheckboxButton por el nombre del módulo que esté utilizando.

Sé que esto se responde, pero aquí hay una experiencia más.

Estaba teniendo algunos problemas no relacionados con este problema, pero en el proceso eliminé @IBInspectable de los vars de mi clase y eliminé los atributos del inspector de identidad (alt-apple-3).

Después de solucionar el problema (código) con el componente, lo actualicé todo un montón de veces, pero todavía no hay atributos en el inspector de identidad.

Eventualmente, noté que estaban de vuelta, pero solo en el inspector de atributos (alt-apple-4) . Tan pronto como les agregué valores allí, volvieron a aparecer en el inspector de identidad

La respuesta de Dave Thomas anterior me dio la solución (inversa) cuando no la de los demás (Derived Data, Editor> Refresh) sí, pero en aras de la claridad en caso de que las personas no estén seguras de dónde editar el XML … no lo hace ¡Necesito hacerlo!

  1. En su archivo de guión gráfico, seleccione la vista problemática
  2. En la barra lateral derecha, seleccione la pestaña Inspector de identidad (tercera opción de la izquierda).
  3. Tendrás tu clase personalizada, que ya debería estar configurada, y el Module . Para mí esto estaba vacío, y estaba obteniendo los mismos errores que OP. Configuré el Module para mi nombre de proyecto y BAM – ¡comenzó a funcionar después de la reconstrucción!

Acabo de leer el problema. Intenté todas las cosas enumeradas aquí y en otra parte sin ninguna suerte. Este es un guión gráfico que funcionó bien para siempre y de repente dejó de funcionar con el problema “Ignorar el atributo de tiempo de ejecución definido por el usuario …”.

Por alguna razón, eliminar este código de uno de mis IBDesignable lo arregló:

 -(void)viewDidLoad { self.clipsToBounds = YES; } 

al quitar esto, todas las advertencias desaparecen, incluso en otros objetos IBDesignable. No tengo idea de por qué este paso lo solucionó, pero tal vez ayudará a alguien más también.

Estaba teniendo el mismo problema y tuve que cambiar el cornerRadius y BorderWidth para que fuera una cadena y luego enviarlo a CGFloat, era la única solución para mí para poder cambiar los valores y ver los cambios en el constructor de la interfaz.

 @IBInspectable var borderColor: UIColor? { didSet { layer.borderColor = borderColor!.CGColor } } @IBInspectable var borderWidth: String? { didSet { layer.borderWidth = CGFloat(Int(borderWidth!) ?? 0) } } @IBInspectable var cornerRadius: String? { didSet { layer.cornerRadius = CGFloat(Int(cornerRadius!) ?? 0) layer.masksToBounds = layer.cornerRadius > 0 } } 
Intereting Posts