我正在使用 Objective-C 在 XCode 6.4 中制作自定义 UI 组件。在我每次更改 IBInspectable 值之一时使用该组件的主情节提要中,我收到以下错误:
Main.storyboard: warning: IB Designables: Ignoring user defined runtime attribute for key path "icon" on instance of "UIView". Hit an exception when attempting to set its value: [<UIView 0x7fc33a5601c0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key icon.
我正在加载一个 .xib 文件,并且我正在覆盖 initWithCoder 和 initWithFrame 方法,如下所示:
- (void) loadView {
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
UIView *view = [[bundle loadNibNamed:@"TheNameOfTheNIB" owner:self options:nil] firstObject];
[self addSubview:view];
view.frame = self.bounds;
view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[iconButtton setImage:_icon forState:UIControlStateNormal|UIControlStateSelected];
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self && self.subviews.count == 0) {
[self loadView];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self loadView];
}
return self;
}
在 initWithCoder: 中,我不得不检查是否有子视图,因为它进入了无限循环(loadView 中的 xib 文件再次调用 initWithCoder:。
因此,当我构建并运行它时,它会正确显示(但仅使用 NIB 中的默认值而不是我在情节提要中传递的正确值),但组件的实时预览根本不会显示在 Interface Builder 中.
更新
这是自定义 UI 组件的头文件
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface CustomComponent : UIView
@property (assign, nonatomic) IBInspectable UIImage *icon;
@property (weak, nonatomic) IBOutlet UIButton *iconButtton;
@end