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 ocurría 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
}
}
}
Agregué UIView
a un controlador de vista en el guión gráfico y establecí su subclase en CustomView
.
Esto agrega la fila "Designables". Está atascado en "Actualizando" y la información sobre herramientas dice "Esperando que Target se compile". Nunca cambia de este estado.
Cuando me muevo a la inspección de atributos, puedo establecer estas IBInspectable
propiedades:
Y una vez configurados, también aparecen en los "Atributos de tiempo de ejecución definidos por el usuario":
Sin embargo, el estado de "Designables" nunca se mueve más allá de "Actualizando" con la misma información sobre herramientas (he intentado compilar Cmd + B varias veces, nada cambia).
Además, a medida que configuro las IBInspectable
propiedades, recibo una advertencia para cada una:
IBDesignables - Ignorando el atributo de tiempo de ejecución definido por el usuario para la ruta de acceso clave "borderColor" en la instancia de "UIView" ... esta clase no es compatible con la codificación de valores clave para el key borderColor.
Captura de pantalla de las advertencias generadas:
Estoy familiarizado con los problemas que cumplen con la 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 una "Vista personalizada" (no una "UIView" normal, 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 algún detalle importante, 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ó como un encanto (tenía la intención de hacer esta publicación anoche, pero la computadora en la que estaba entonces no tenía este problema).
Según los comentarios, se ha sugerido que quizás el .m
archivo 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 comencé a intentar hacer esto, entendía que las IB_DESIGNABLE
clases tenían que ser parte de un UIKit
marco diferente . Así que desde esta primera pantalla, se puede ver que he creado 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 indicando que CustomView.m
se incluye para ser construido con el CustomViews
framework:
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á malCustomView
,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 esos proyectos, y estoy no hacer nada conIB_DESIGNABLE
oIBInspectable
allí.
He intentado y vuelto a intentar esto varias veces. 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 descrito en esta pregunta ocurre todo el tiempo.
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. Ambos equipos 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 inverosímil. Reinicié el proyecto varias veces, reinicié la computadora varias veces. Me parece que si hubiera una mala RAM en una computadora de aproximadamente 6 meses de antigüedad, estaría viendo otros problemas y que este problema sería menos constante. Pero este problema persiste a pesar de que muchas veces 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 IBInspectable
propiedades realmente se muestra como espero que lo muestre el guión gráfico. Sin embargo, imagino que este sería el caso incluso sin las directivas IB_DESIGNABLE
y IBInspectable
, ya que se crean como atributos de tiempo de ejecución definidos por el usuario.
Respuestas:
Basado en la sugerencia de chrisco de depurar la vista seleccionada (que ya había hecho, pero fui a intentarlo de nuevo por si acaso), noté un par de otras opciones en la parte inferior del menú Editor.
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
IBInspectable
propiedades).Luego pasé por todo el proceso nuevamente para confirmar que esta es la solución.
He creado una nueva clase,
ThirdView
. Esta clase es idéntica a las demás, nuevamente. Cambié la clase de mi vista aThirdView
y obtuve algo ligeramente diferente esta vez:Haciendo clic en "Mostrar" para ver las advertencias:
Uno nuevo esta vez:
En realidad, esto no es más útil que lo que ya existía. Además, ahora las otras tres advertencias se han duplicado en 6 extrañamente.
De todos modos, si hago clic en "Actualizar todas las vistas" del 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 fueron cosas con las que nunca me metí en casa. En casa, simplemente funcionó. Así que encendí "Actualizar vistas automáticamente" y creé una "FourthView" 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 de designables decía "Actualizando" por un breve momento y finalmente decía "Up to date":
Entonces, revisé mi computadora en casa. La opción "Actualizar vistas automáticamente" está activada en la computadora que siempre estaba funcionando. Estaba apagado en la computadora que no lo estaba. No recuerdo haber tocado esta opción de menú. Ni siquiera puedo decirles con certeza si existía antes de Xcode 6. Pero esta opción es lo que marca la diferencia.
TL; DR, si tiene el mismo problema descrito en la pregunta, asegúrese de que "Actualizar vistas automáticamente" esté activado (o "Actualizar todas las vistas" manualmente cuando necesite una actualización en IB):
fuente
Tengo algunos detalles más que pueden hacer 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, 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 "Creador de interfaces". Verá que, por el bien de cargar el marco de vistas IBDesignable personalizado, compilará MUCHAS cosas. Si alguno de estos objetivos NO se compila, como los objetivos de prueba unitaria (quizás en desuso) (incluso si no están relacionados en absoluto con el código que carga estas vistas o el guión gráfico), IB fallará al cargar su dll.
En mi caso, IB trató de compilar 8 objetivos, incluidos 4 que eran pruebas unitarias que no se habían actualizado desde los cambios de refactorización recientes 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 nunca cargaría el guión gráfico en el curso de la ejecución de estas pruebas unitarias. Sin embargo, IB dependía de la compilación del espacio de trabajo completo para que funcionara.
fuente
Solo una pista rápida para cualquier otra persona que tenga este problema: recuerde especificar el tipo de variable.
fuente
Recibí 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 IBDesignable personalizada.Resultó que, en mi caso, tenía que ver con el caché de Xcode.
Purga
DerivedData
y la advertencia desaparece.fuente
En caso de que alguien más se encuentre con el error La clase IB Designables 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 storyboard llamada customModule.
Por ejemplo, tenía una clase llamada ForwardArrow dentro de un marco separado que agregué accidentalmente a mi objetivo principal.
Entonces, el XML de 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 no se encontró ningún error de clase.
Entonces TLDR; Asegúrese de que si su IBDesignable está en otro marco, el atributo xml customModule en su storyboard esté configurado en el valor correcto. Y si no está allí, agréguelo.
Ejemplo de mi fuente:
fuente
Como mi ejemplo, estaba usando CheckboxButton a través de pod y los gráficos de la casilla de verificación nunca aparecen en el guión gráfico mientras tengo los mismos problemas descritos en la pregunta aquí:
y
La forma en que resolví mi problema fue proporcionar el módulo con el nombre CheckboxButton de la siguiente manera:
Nota: debe reemplazar CheckboxButton por el nombre del módulo que esté utilizando.
fuente
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 eso me provocó ese error. Simplemente elimine todo y reconstruya.
fuente
Sé que esto está respondido, pero aquí hay una experiencia más.
Estaba teniendo algunos problemas no relacionados con este problema, pero en el proceso eliminé @IBInspectable de las variables de mi clase y eliminé los atributos del inspector de identidad (alt-apple-3).
Después de solucionar el problema (de código) con el componente, actualicé todo un montón de veces, pero todavía no hay atributos en el inspector de identidad.
Finalmente, noté que estaban de regreso, pero solo en el inspector de atributos (alt-apple-4) . Tan pronto como les agregué valores allí, reaparecieron en el inspector de identidad.
fuente
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 es necesario!
Module
. Para mí, esto estaba vacío y recibía los mismos errores que OP. Configuré el nombre deModule
mi proyecto y BAM: ¡comenzó a funcionar después de la reconstrucción!fuente
Acabo de pasar por el timbre de 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, eliminar este código de uno de mis IBDesignable lo solucionó:
la eliminación de esto hizo 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.
fuente
Estaba teniendo el mismo problema y tuve que cambiar cornerRadius y BorderWidth para que fueran String y luego convertirlo en CGFloat, era la única solución para mí poder cambiar los valores y ver los cambios en el generador de interfaces.
fuente
Float
lugar deCGFloat
y lanzar eso en su lugar