我知道 IBInspectable-properties 的默认值可以设置为:
@IBInspectable var propertyName:propertyType = defaultValue
在斯威夫特。但是如何在 Objective-C 中实现类似的效果,以便我可以将某些属性的默认值设置为 Interface Builder 中的某些内容?
我知道 IBInspectable-properties 的默认值可以设置为:
@IBInspectable var propertyName:propertyType = defaultValue
在斯威夫特。但是如何在 Objective-C 中实现类似的效果,以便我可以将某些属性的默认值设置为 Interface Builder 中的某些内容?
由于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
我是这样使用的
@IBInspectable var propertyNameValue:propertyType?
var propertyName:propertyType { return propertyNameValue ?? defaultValue }
如果propertyNameValue
有nil
,propertyName
将返回defaultValue
。
我这样写我的代码。无论是在界面构建器中进行设计还是作为应用程序运行时,它对我来说都非常有效。
@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;
}
首先我试图覆盖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];
}
为什么不使用宏,例如:
#if TARGET_INTERFACE_BUILDER
// .....IB only specific code when being rendered in IB
#endif
???
选择prepareForInterfaceBuilder
器还可以帮助您实现 IB 特定代码。