如何在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 } 

如果propertyNameValuenil ,则propertyName将返回defaultValue

为什么不使用使用macros如:

 #if TARGET_INTERFACE_BUILDER // .....IB only specific code when being rendered in IB #endif 

???

prepareForInterfaceBuilderselect器也可以帮助你实现IB特定的代码。

有关这2点的更多信息:
https://developer.apple.com/library/ios/recipes/xcode_help-IB_objects_media/chapters/CreatingaLiveViewofaCustomObject.html

首先,我试图覆盖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]; }