我知道IBInspectable-properties的默认值可以设置为:
Swift中的 @IBInspectable var propertyName:propertyType = defaultValue
。但是我如何在Objective-C中实现类似的效果,以便我可以在Interface Builder中将某些属性的默认值设置为某个?
答案 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 }
如果propertyNameValue
有nil
,propertyName
将返回defaultValue
。
答案 3 :(得分:-1)
为什么不使用宏,例如:
#if TARGET_INTERFACE_BUILDER
// .....IB only specific code when being rendered in IB
#endif
???
prepareForInterfaceBuilder
选择器也可以帮助您实现IB特定代码。
答案 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];
}