如何在Objective-C中设置IBInspectable的默认值?

时间:2014-11-20 15:59:38

标签: objective-c xcode swift interface-builder ibinspectable

我知道IBInspectable-properties的默认值可以设置为:

Swift中的

@IBInspectable var propertyName:propertyType = defaultValue。但是我如何在Objective-C中实现类似的效果,以便我可以在Interface Builder中将某些属性的默认值设置为某个?

5 个答案:

答案 0 :(得分:54)

由于IBInspectable值在initWithCoder:之后和awakeFromNib:之前设置,因此您可以在initWithCoder:方法中设置默认值。

@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

答案 1 :(得分:1)

我写了这样的代码。在界面构建器中设计或作为应用程序运行时,它对我来说非常有效。

@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;
}

答案 2 :(得分:1)

我正在那样使用

@IBInspectable var propertyNameValue:propertyType?
var propertyName:propertyType { return propertyNameValue ?? defaultValue }

如果propertyNameValuenilpropertyName将返回defaultValue

答案 3 :(得分:-1)

为什么不使用宏,例如:

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

???

prepareForInterfaceBuilder选择器也可以帮助您实现IB特定代码。

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

答案 4 :(得分:-1)

首先,我尝试覆盖getter并做了类似的事情:

- (UIColor *)borderColor {
    return _borderColor ?: [UIColor greenColor];
}

但在这种情况下,我收到了有关未声明标识符_borderColor的问题。

好的,我试图通过自定义getter来避免这个问题。

- (UIColor *)getBorderColor {
    return _borderColor ?: [UIColor greenColor];
}

实际上它并不是一个合适的吸气剂,因为我们并没有将这种方法指向吸气剂。如果我们指出我们会收到有关未声明标识符的问题,那就是我们赢了的原因。

然后我们使用此方法在updateUI方法中获取属性值。

我们还必须覆盖setter:

- (void)setBorderColor:(UIColor *)borderColor {
  _borderColor = borderColor;
  [self updateUI];
}