68

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

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

4

5 回答 5

62

由于IBInspectable值是在 afterinitWithCoder:和 beforeawakeFromNib:设置的,因此您可以在方法中设置默认值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
于 2014-11-21T12:52:59.013 回答
1

我是这样使用的

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

如果propertyNameValuenilpropertyName将返回defaultValue

于 2015-08-03T09:59:16.607 回答
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;
}
于 2015-08-02T12:31:43.717 回答
-1

首先我试图覆盖getter并做了这样的事情:

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

但在那种情况下,我收到了关于 undeclared identifier 的问题_borderColor

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

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

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

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

我们还必须覆盖 setter:

- (void)setBorderColor:(UIColor *)borderColor {
  _borderColor = borderColor;
  [self updateUI];
}
于 2015-03-02T22:01:42.883 回答
-1

为什么不使用宏,例如:

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

???

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

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

于 2014-12-08T20:55:50.287 回答