我知道在Swift中,IBInspectable属性的默认值可以设置为:
@IBInspectable var propertyName: propertyType = defaultValue
。但是,在Objective-C中我该如何实现类似的效果,以便我可以在Interface Builder中将某些属性的默认值设置为某些值?
我知道在Swift中,IBInspectable属性的默认值可以设置为:
@IBInspectable var propertyName: propertyType = defaultValue
。但是,在Objective-C中我该如何实现类似的效果,以便我可以在Interface Builder中将某些属性的默认值设置为某些值?
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
initWithCoder:
期间使用IBInspectables中的值来设置我的自定义控件,但是无法弄清为什么它们都为空。现在,我在awakeFromNib
中设置了我的自定义控件,一切都好了。谢谢! - user2320861- (void)prepareForInterfaceBuilder
方法,该方法将使用可检查的值来渲染内容。 - ElyashivLavi@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 }
propertyNameValue
为nil
,则propertyName
将返回defaultValue
。首先我尝试了重写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];
}
#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
prepareForInterfaceBuilder
方法。 - Can Poyrazoğlu
UIFont
作为 IBInspectable 类型。我本以为可能会有这种可能性,因为UILabel
有它。嘿,没关系 :) - Fogmeister