example designable create bool objective-c xcode swift interface-builder ibinspectable

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 .