objective c - designable - ¿Cómo establecer valores predeterminados para IBInspectable en Objective-C?
swift 4 ibdesignable (5)
¿Por qué no usar usar la macro como:
#if TARGET_INTERFACE_BUILDER
// .....IB only specific code when being rendered in IB
#endif
???
El selector
prepareForInterfaceBuilder
también puede ayudarlo a implementar código específico de IB.
Más información sobre esos 2 puntos aquí:
https://developer.apple.com/library/ios/recipes/xcode_help-IB_objects_media/chapters/CreatingaLiveViewofaCustomObject.html
Sé que los valores predeterminados de IBInspectable-properties se pueden establecer como:
@IBInspectable var propertyName:propertyType = defaultValue
en Swift.
Pero, ¿cómo puedo lograr un efecto similar en Objective-C para poder tener el valor predeterminado de alguna propiedad establecida en algo en Interface Builder?
Dado que los valores de
IBInspectable
se establecen después de
initWithCoder:
y antes de
awakeFromNib:
puede establecer los valores predeterminados en
initWithCoder:
método.
@interface MyView : UIView
@property (copy, nonatomic) IBInspectable NSString *myProp;
@property (assign, nonatomic) BOOL createdFromIB;
@end
@implementation MyView
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if(self != nil) {
self.myProp = @"foo";
self.createdFromIB = YES;
}
return self;
}
- (void)awakeFromNib {
if (self.createdFromIB) {
//add anything required in IB-define way
}
NSLog(@"%@", self.myProp);
}
@end
En primer lugar, intenté anular getter e hice algo como esto:
- (UIColor *)borderColor {
return _borderColor ?: [UIColor greenColor];
}
Pero en ese caso recibí un problema sobre el identificador no declarado
_borderColor
.
Ok, traté de evitar este problema a través de getter personalizado.
- (UIColor *)getBorderColor {
return _borderColor ?: [UIColor greenColor];
}
En realidad, no es un captador adecuado, ya que no señalamos este método como captador. En caso de que señalemos que recibiremos un problema sobre el identificador no declarado, es por eso que no lo haremos.
Luego usamos este método para obtener el valor de la propiedad en el método updateUI.
También tenemos que anular setter:
- (void)setBorderColor:(UIColor *)borderColor {
_borderColor = borderColor;
[self updateUI];
}
Escribí mi código así. Funciona bastante bien para mí, tanto al diseñar en el generador de interfaces como al ejecutarlo como una aplicación.
@interface MyView : UIView
@property (copy, nonatomic) IBInspectable propertyType *propertyName;
@end
- (void)makeDefaultValues {
_propertyName = defaultValue;
//Other properties...
}
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self makeDefaultValues];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
[self makeDefaultValues];
}
return self;
}
Estoy usando asi
@IBInspectable var propertyNameValue:propertyType?
var propertyName:propertyType { return propertyNameValue ?? defaultValue }
si
propertyNameValue
tiene
nil
,
propertyName
devolverá
defaultValue
.