El button UIB con IB_DESIGNABLE arroja advertencia de atributo de time de ejecución y no se muestra en el Generador de interfaces

Estoy ejecutando Xcode 6.1 y he estado usando IB_DESIGNABLE con IBInspectable para bastantes proyectos, pero de repente ya no funciona. He creado botones subclass que organizan la image y el título verticalmente centrados uno encima del otro y permiten al usuario establecer un ancho y color de borde a través de IB con IBInspectable.

Se registra la siguiente advertencia y no hay una vista previa disponible de mi código en drawRect:

warning: IB Designables: Ignoring user defined runtime attribute for key path "spacingBetweenLabelAndImage" on instance of "UIButton". Hit an exception when attempting to set its value: [<UIButton 0x7f9278591260> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key spacingBetweenLabelAndImage. 

Aun así, el time de ejecución se reproduce como pensaba hacer y también cumple con el mismo espaciado personalizado que he agregado a través de IB.

Aquí está el código del menu que reorganiza el button y el título:

 #import "HamburgerButton.h" IB_DESIGNABLE @interface HamburgerImageButton : HamburgerButton @property IBInspectable CGFloat spacingBetweenLabelAndImage; @end 

Implementación:

 #import "HamburgerImageButton.h" @implementation HamburgerImageButton - (void)drawRect:(CGRect)rect { [super drawRect:rect]; CGSize imageSize = self.imageView.frame.size; CGSize titleSize = self.titleLabel.frame.size; // Move the label left and the image right by half the width CGFloat leftInset = titleSize.width / 2; CGFloat rightInset = imageSize.width / 2; CGFloat halfSpacing = self.spacingBetweenLabelAndImage == 0 ? 0 : self.spacingBetweenLabelAndImage / 2; CGFloat topInset = imageSize.height / 2 + halfSpacing; CGFloat bottomInset = titleSize.height / 2 + halfSpacing; UIEdgeInsets imageInsets = UIEdgeInsetsMake(-bottomInset, leftInset, bottomInset, -leftInset); UIEdgeInsets titleInsets = UIEdgeInsetsMake(topInset, -rightInset, -topInset, rightInset); self.imageEdgeInsets = imageInsets; self.titleEdgeInsets = titleInsets; } @end 

Probablemente hayas notado que henetworkinga el HamburgerButton. Este button básico de hamburguesa no tiene una image y solo dibuja el borde alnetworkingedor del button. Este button básico de hamburguesa tiene exactamente el mismo problema: no dibuja su borde en drawRect en IB y tiene el mismo tipo de errores. Aquí está el código por completar:

 #import <UIKit/UIKit.h> IB_DESIGNABLE @interface HamburgerButton : UIButton @property IBInspectable CGFloat borderWidth; @property IBInspectable UIColor *borderColor; @end 

Implementación:

 #import "HamburgerButton.h" #import <QuartzCore/QuartzCore.h> @implementation HamburgerButton - (void)copyInspectables { self.layer.borderWidth = self.borderWidth; self.layer.borderColor = self.borderColor.CGColor; } - (void)drawRect:(CGRect)rect { [self copyInspectables]; } @end 

Realmente no entiendo por qué simplemente arroja una advertencia y nada más. Realmente no cambié lo que hice. Revisé el guión gráfico, es iOS 7 y más, destinado a ejecutarse en Xcode 6 (más reciente).

Se queja de no poder encontrar ese valor en UIButton y eso es un poco raro porque lo subclasé.


Actualización: Así que cambié todo y funcionó. Ahora se vuelve a dar vueltas, sin cambiar nada más. Creo que hay un error en Xcode 6.1 …: /

He estado trabajando extensamente con Live Views ya que es una introducción y muchas características nuevas en Xcode inicialmente, tiene algunas fallas. Todavía me gusta mucho y espero que se mejore en las versiones más nuevas.

Porque:

Las vistas en vivo funcionan con las properties @property que obtienen una label IB_Designable especial que le dará a la class de interfaz de usuario los attributes adicionales a los que puede acercarse a través de Atributos de time de ejecución definidos por el usuario que se configurarán a través del Inspector de attributes. Verá que todas esas properties también existen en el Inspector de identidad. La causa raíz del problema es que no puede asignar esos attributes de time de ejecución definidos por el usuario a las properties expuestas.

Tan pronto como abra un Storyboard o xib que use IB_Designable, Xcode volverá a comstackr la pantalla en cada cambio si tiene "Actualizar actualizaciones automáticamente" activada. Dado que su código influye en su interfaz de usuario también, esto no tiene que ser un cambio en el Interface Builder per se.

Con proyectos más simples en máquinas más rápidas, esto funciona bastante bien la mayoría de las veces. Con proyectos más grandes que también tienen más IB_Designable, la CPU simplemente no tiene la capacidad suficiente para estar contigo y obtendrás una especie de error de time de espera mientras renderizas la interfaz de usuario. Esta es la causa de la "advertencia: IB Designables: Ignorar el atributo de time de ejecución definido por el usuario para la ruta key" spacingBetweenLabelAndImage "en la instancia de" UIButton ". Golpee una exception cuando intente establecer su valor: [setValue: forUndefinedKey:]: esta class es no compatible con la encoding de valores key para la separación de keys entre la label y la image. error.

Tampoco actualizará su interfaz de usuario con su código personalizado. Esto no es un problema cuando lo ejecuta, porque en el time de ejecución reflejará esos cambios.

Otra causa puede ser que el código simplemente no se comstack cuando intenta comstackr en segundo plano. Esto es inevitable cuando está trabajando en el código para que también lo active con frecuencia.

Solución:

Debemos asegurarnos de que la class de vista personalizada se comstack nuevamente para que las properties se puedan configurar con éxito a través de Interface Builder

  • Mientras está en un guión gráfico, vaya a "Editor" en el menu de la barra superior
  • desmarque "Actualizar vistas automáticamente" si aún estaba encendido
  • Cierre todas las tabs de su guión gráfico.
  • Rebuild el proyecto
  • Solucione todos los errores de compilation si los hubiera
  • Vuelva a abrir su guión gráfico.
  • Vaya a "Editor" nuevamente y click "Actualizar todas las vistas"

Las advertencias deben desaparecer y, si funcionó, también verá su código de vista personalizado nuevamente.

Después de un comentario a continuación por sunkas: siempre es una muy buena idea limpiar su solución a background en caso de problemas extraños que persisten.

Cómo arreglé personalmente esto:

En el inspector de identidad en Atributos de time de ejecución definidos por el usuario, noté que tenía un elemento IB_Inspectable antiguo que había eliminado de mi código, pero todavía estaba allí. Eliminándolo con el button – se deshizo de este error.

identityinspector

Intente cambiar su statement " CGFloat " para spacingBetweenLabelAndImage en " NSNumber ".

Hasta donde yo sé, no puedes llamar a " setValue: " en una variable de tipo C.

Cambiar la statement de " spacingBetwenLabelAndImage " a NSNumber también requeriría que modifique un bit de código también:

 CGFloat halfSpacing = self.spacingBetweenLabelAndImage == 0 ? 0 : self.spacingBetweenLabelAndImage / 2; 

podría convertirse en algo así:

 CGFloat halfSpacing = (self.spacingBetweenLabelAndImage ? ([self.spacingBetweenLabelAndImage floatValue] / 2) : 0.0); 

(No estoy 100% seguro si se trata de una traducción perfecta de la primera línea, pero quería mostrar cómo get un floatValue de un NSNumber)

Usé el método provisto por el Departamento B pero realmente no funcionó. Sin embargo, solucioné mi problema 1. Seleccionando las vistas con errores desde el tablero de historias 2. Haciendo clic (Editor – Depurar la vista seleccionada) Espero que esto ayude

Si está seguro de que establece todos los configuradores correctamente, y si importó algunos otros SDK en su proyecto y está recibiendo este problema, marque 'Marcos y bibliotecas vinculadas' en Destino – General.

Después de vincular correctamente algunos frameworks SDK, el error desapareció.

Tuve un problema similar, pero realmente eliminé la propiedad de la class y Interface Builder todavía se quejaba de la propiedad faltante, difícil.

Intenté muchas cosas, como limpiar, rebuild … ¡Pero nada funcionó!

Lo que realmente se resolvió fue hacer clic derecho en el file Storyboard, seleccionando "Abrir como" y luego "Código fuente". Esto abrió el contenido del storyboard XML en el editor y pude search references a la propiedad que faltaba hasta que encontré la sección:

 <userDefinedRuntimeAttributes> <userDefinedRuntimeAttribute... keyPath="My Missing Property Name"> ... </userDefinedRuntimeAttributes> 

Después de eliminar toda la sección, guardé el file y actualicé la vista en Interface Builder. ¡Ahora todas las advertencias se han ido!

Tuve este error, cuando tiene dos objectives. Uno con mi proyecto principal y otro con destino, donde tengo classs diseñables (para una compilation más rápida).
El problema era que en el storyboard faltaban un Módulo.

introduzca la descripción de la imagen aquí