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.