ios - example - IB_DESIGNABLE, IBInspectable: el generador de interfaces no se actualiza
ibinspectable swift 4 (11)
Acabo de pasar por el timbre sobre este problema. Probé todas las cosas enumeradas aquí y en otros lugares sin suerte. Este es un guión gráfico que funcionó bien para siempre y de repente dejó de funcionar con el problema "Ignorando el atributo de tiempo de ejecución definido por el usuario ...".
Por alguna razón, la eliminación de este código de uno de mis IBDesignable lo arregló:
-(void)viewDidLoad {
self.clipsToBounds = YES;
}
eliminar esto provocó que todas las advertencias desaparecieran, incluso en otros objetos IBDesignable. No tengo idea de por qué este paso lo solucionó, pero tal vez también ayude a alguien más.
Tengo el siguiente conjunto de código:
CustomView.h
#import <UIKit/UIKit.h>
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
una
UIView
a un controlador de vista en el guión gráfico y configuré su subclase en
CustomView
.
Esto agrega la fila "Designables". Está atascado en "Actualización" y la información sobre herramientas dice "Esperando a que el objetivo se compile". Nunca cambia de este estado.
Cuando me muevo a la inspección de atributos, puedo establecer estas propiedades de
IBInspectable
:
Y una vez configurados, también se muestran en los "Atributos de tiempo de ejecución definidos por el usuario":
Sin embargo, el estado "Designables" nunca va más allá de "Actualizar" con la misma información sobre herramientas (he intentado crear Cmd + B varias veces, nada cambia).
Además, cuando configuro las propiedades de
IBInspectable
, recibo una advertencia para cada una:
IBDesignables - Ignorando el atributo de tiempo de ejecución definido por el usuario para la ruta de clave "borderColor" en el caso de "UIView" ... esta clase no es compatible con la codificación de valores clave para la clave borderColor.
Captura de pantalla de las advertencias generadas:
Estoy familiarizado con los problemas de codificación de valores clave y, en general, sé cómo resolverlos ... pero no entiendo cómo resolver este problema aquí. Según el inspector de identidad de la vista, la vista es un "CustomView" (no un "UIView" normal, que no tiene estas propiedades). Y si la vista no fuera un "CustomView", 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? Avíseme si he omitido algunos detalles importantes, pero para 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ó de maravilla (tenía la intención de hacer esta publicación anoche, pero la computadora en la que estaba no tenía este problema).
Según los comentarios, se ha sugerido que quizás el archivo
.m
no esté incluido y eso podría estar causando el problema.
Pensé que seguramente habría salido de mi camino para que este escenario fuera el caso, pero lo comprobé de todos modos.
Cuando empecé a intentar hacer esto, entendí que las clases
IB_DESIGNABLE
tenían que ser parte de un marco
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
está incluido para ser construido con el marco
CustomViews
:
Mientras tanto, la siguiente captura de pantalla indica varias cosas:
-
CustomViews.framework
se incluye adecuadamente en el proyecto principal. -
OtherView.m
también se incluye como fuente de compilación, por lo que incluso si algo está mal conCustomView
,OtherView
debería funcionar, sin embargo, genera errores idénticos. -
Main.storyboard
yLaunchScreen.xib
se muestran en rojo. No tengo 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 conIB_DESIGNABLE
oIBInspectable
allí.
He intentado y reintentado esto varias veces ahora. Funciona todo el tiempo en mi computadora en casa: no puedo reproducir el problema descrito en esta pregunta en casa. En el trabajo, nunca funciona. El problema descrito en esta pregunta ocurre cada vez.
Ambas computadoras son Mac Minis compradas nuevas este año (no los nuevos modelos, 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 mala RAM. Eso me parece descabellado. He reiniciado el proyecto varias veces, reinicié la computadora varias veces. Me parece que si hubiera una RAM defectuosa en una computadora de aproximadamente 6 meses, estaría viendo otros problemas y que este problema sería menos constante. Pero este problema exacto persiste a pesar de que se reinicia todo el proyecto desde cero y se reinicia por completo en la computadora.
Vale la pena señalar que si realmente compilo y ejecuto este proyecto, la vista personalizada con las propiedades de
IBInspectable
realmente se muestra como espero que el guión gráfico lo muestre.
Sin embargo, me 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.
Basado en la sugerencia de chrisco de depurar la vista seleccionada (que ya había hecho, pero fui a intentarlo de nuevo), noté un par de otras opciones en la parte inferior del menú Editor.
- Actualizar vistas automáticamente
- Actualizar todas las vistas
Hice clic en "Actualizar todas las vistas" y después de que Xcode pensara un poco, de repente el guión gráfico mostraba mi vista como se esperaba (aplicando correctamente mis propiedades de
IBInspectable
).
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 demás, nuevamente.
Cambié la clase de mi vista a
ThirdView
y esta vez obtuve algo ligeramente diferente:
Al hacer clic en "Mostrar" para ver las advertencias:
Una nueva esta vez:
Usando la clase UIView para objeto con clase personalizada porque la clase ThirdView no existe.
Esto no es realmente más útil de 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 hago clic en "Actualizar todas las vistas" en el menú desplegable del Editor nuevamente, 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 cosas con las que nunca me metí en casa. En casa, simplemente funcionó. Así que encendí "Actualizar vistas automáticamente" 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 designada dijo "Actualizando" por un breve momento y finalmente dijo "Actualizada":
Entonces, revisé mi computadora en casa. "Actualizar vistas automáticamente" está activado en la computadora que siempre estaba funcionando. Estaba apagado en la computadora que no estaba. No recuerdo haber tocado esta opción del menú. Ni siquiera puedo decirte con certeza si existía antes de Xcode 6. Pero esta opción es lo que estaba haciendo la diferencia.
TL; DR, si tiene el mismo problema descrito en la pregunta, asegúrese de que "Actualizar automáticamente las vistas" esté activado (o "Actualizar todas las vistas" manualmente cuando necesite una actualización en IB):
Como mi ejemplo, estaba usando CheckboxButton través de pod y los gráficos de la casilla de verificación nunca se muestran en el guión gráfico mientras recibo los mismos problemas descritos en la pregunta aquí:
advertencia: Designables de IB: Uso de la clase UIView para objeto con clase personalizada porque la clase CheckboxButton no existe
y
advertencia: IB Designables: Ignorando 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 compatible con la codificación del valor clave para la clave checkColor.
La forma en que resolvió mi problema fue proporcionarle al módulo el nombre CheckboxButton de la siguiente manera:
Nota: debe reemplazar CheckboxButton por el nombre del módulo que esté utilizando.
En caso de que alguien más se encuentre con el error, la clase de Designables de IB no existe, por la misma razón que yo. La respuesta principal no fue mi problema ... pero aquí hay un problema ligeramente relacionado ...
Hay una propiedad oculta en el código fuente del guión gráfico llamada CustomModule.
Por ejemplo, tuve una clase llamada ForwardArrow dentro de un marco separado que accidentalmente agregué a mi objetivo principal.
Por lo tanto, el XML para algunas vistas terminó como customClass = "ForwardArrow" customModule = "MainTargetNameWasHere"
Cuando los eliminé del objetivo principal en la compilación, el guión gráfico no actualizó MainTargetNameWasHere a CustomViews, que es el marco donde estaba ubicado y comenzó a dar que ninguna clase encontró error.
Entonces TLDR; Asegúrese de que si su IBDesignable se encuentra en otro marco, el atributo customModule xml en su guión gráfico esté configurado en el valor correcto. Y si no está allí, agréguelo.
Ejemplo de mi fuente:
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUG-jc-2Ml" customClass="ForwardArrow" customModule="CustomViews">
Estaba teniendo el mismo problema y tuve que cambiar el cornerRadius y el BorderWidth para ser un String y luego convertirlo a CGFloat, fue la única solución para mí poder cambiar los valores y ver los cambios en el generador de interfaces.
@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
}
}
Personalmente, resolví este problema usando el botón "-" para eliminar contenido de mi inspector de identidad. Cuando elimina clases personalizadas, cambia el contenido en el IB y luego agrega una nueva clase personalizada, los elementos designables en el inspector de identidad no se eliminan y me causó ese error. Simplemente elimine todo y reconstruya.
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 en mi clase y eliminé los atributos del inspector de identidad (alt-apple-3).
Después de solucionar el problema (del código) con el componente, actualicé todo un montón de veces, pero aún no había atributos en el inspector de identidad.
Finalmente, noté que habían regresado, pero solo en el inspector de atributos (alt-apple-4) . Tan pronto como les agregué valores allí, reaparecieron en el inspector de identidad
Solo una pista rápida para cualquier persona que 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 hacer que sus clases de IBDesignable no se carguen.
Seleccione su storyboard / xib problemático donde deberían mostrarse sus vistas personalizadas.
En el área del navegador, diríjase 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 lance una compilación para un montón de cosas que, estoy seguro, no esperarías.
En el Navegador de informes, haga clic en "Por grupo" para filtrar el contenido y consulte la sección "Generador de interfaces". Verá que, en aras de cargar el marco de vistas IBDesignable personalizado, recopilará MUCHAS cosas. Si alguno de estos objetivos NO se compila, como los objetivos de prueba de unidad (tal vez desaprobados) (incluso si no tienen ninguna relación con el código que carga estas vistas o el guión gráfico), entonces IB fallará al cargar su dll.
En mi caso, IB intentó compilar 8 objetivos, incluidos 4 en los que las pruebas unitarias 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 correctamente mis vistas personalizadas donde no están relacionadas o incluso vinculadas con estas clases, ni cargaría el guión gráfico en el curso de la ejecución de estas pruebas unitarias. Sin embargo, IB tenía una dependencia en todo el espacio de trabajo que compilaba para que funcionara.
Tuve la misma advertencia
Ignoring user defined runtime attribute for key path ..
aunque estoy absolutamente seguro de que no hice nada malo con mi clase de vista personalizada IBDesignable.
Resultó que, en mi caso, tenía que ver con el caché Xcode.
rm -rf ~/Library/Developer/Xcode/DerivedData/*
Purgue
DerivedData
y la advertencia desaparece.
La respuesta de Dave Thomas anterior me dio la solución (inversa) cuando no lo hicieron los demás (Datos Derivados, Editor> Actualizar), pero en aras de la claridad en caso de que la gente no esté segura de dónde editar el XML ... no lo hace '' No es necesario!
- En su archivo de guión gráfico, seleccione la vista problemática
- En la barra lateral derecha, seleccione la pestaña Inspector de identidad (tercera opción desde la izquierda).
-
Tendrás tu clase personalizada, que ya debería estar configurada, y el
Module
. Para mí, esto estaba vacío y recibía los mismos errores que OP. Configuré elModule
con el nombre de mi proyecto y BAM, ¡comenzó a funcionar después de la reconstrucción!