如何在Objective-C中设置IBInspectable的默认值?
我知道IBInspectable-properties的默认值可以设置为:
在Swift中@IBInspectable var propertyName:propertyType = defaultValue
。 但是如何在Objective-C中实现类似的效果,以便我可以将某些属性的默认值设置为Interface Builder中的某些属性?
由于IBInspectable
值是在initWithCoder:
之后和awakeFromNib:
之前设置的,因此可以在initWithCoder:
method中设置默认值。
@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
我写这样的代码。 无论是在界面构build器中进行devise还是作为应用程序运行,它都能很好地工作。
@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; }
我正在使用
@IBInspectable var propertyNameValue:propertyType? var propertyName:propertyType { return propertyNameValue ?? defaultValue }
如果propertyNameValue
有nil
,则propertyName
将返回defaultValue
。
为什么不使用使用macros如:
#if TARGET_INTERFACE_BUILDER // .....IB only specific code when being rendered in IB #endif
???
prepareForInterfaceBuilder
select器也可以帮助你实现IB特定的代码。
首先,我试图覆盖getter,并做了这样的事情:
- (UIColor *)borderColor { return _borderColor ?: [UIColor greenColor]; }
但在这种情况下,我收到了关于未声明的标识符_borderColor
。
好吧,我试图通过自定义getter来避免这个问题。
- (UIColor *)getBorderColor { return _borderColor ?: [UIColor greenColor]; }
其实这不是一个适当的getter,因为我们不把这个方法指向getter。 如果我们指出,我们会收到关于未声明的标识符的问题,这就是为什么我们不会。
然后我们使用这个方法在updateUI方法中获取属性值。
我们也必须重写setter:
- (void)setBorderColor:(UIColor *)borderColor { _borderColor = borderColor; [self updateUI]; }