我想使用Xcode 9.2中的IB_DESIGNABLE常量以及针对iOS SDK 11.2的Objective C来可视化故事板中的XIB。
根据Apple的this article,Interface Builder调用了prepareForInterfaceBuilder
方法,以使您可以执行仅应针对Interface Builder进行的操作。
当Interface Builder实例化具有IB_DESIGNABLE属性的类时,它将调用此方法以使生成的对象知道它是在设计时创建的。您可以在可设计的类中实现此方法,并使用它来配置其设计时外观。
基于此article,我想在情节提要中可视化XIB。当我在ViewController上使用UIView
元素并设置
XibView
nibName
属性MainViewController
设置为XIB文件的名称我收到以下构建时错误:
Main.storyboard:
error: IB Designables:
Failed to render and update auto layout status for MainViewController (8zi-kg-fjR):
The agent threw an exception.
我做错了什么,我得到了这个错误,而不是在Main.storyboard中使用的视图中的可视化XIB?
这是XibView.h
IB_DESIGNABLE
@interface XibView : UIView
@property (nonatomic, strong) IBOutlet UIView* contentView;
@property (nonatomic) IBInspectable NSString* nibName;
@end
这是XibView.m
#import "XibView.h"
@implementation XibView
- (id)initWithCoder:(NSCoder *) coder
{
self = [super initWithCoder: coder];
if (self)
{
[self xibSetup];
}
return self;
}
//---------------------------------------------------------------------
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self xibSetup];
}
return self;
}
//---------------------------------------------------------------------
- (void)prepareForInterfaceBuilder
{
[super prepareForInterfaceBuilder];
[self xibSetup];
}
//---------------------------------------------------------------------
- (void)xibSetup
{
[[NSBundle mainBundle] loadNibNamed:_nibName owner:nil options:nil];
[self addSubview:self.contentView];
self.contentView.frame = self.bounds;
}
@end
答案 0 :(得分:1)
这是我认为存在错误的方法:
- (void)xibSetup
{
[[NSBundle mainBundle] loadNibNamed:_nibName owner:nil options:nil];
[self addSubview:self.contentView];
self.contentView.frame = self.bounds;
}
笔尖加载器无法设置self.contentView
,因为您没有将self
作为owner
的{{1}}参数传递。尝试以下方法:
loadNibNamed:options:
答案 1 :(得分:0)
借助@E.Coms并仍然基于this article,我弄清了问题所在。要在此处提供供他人使用的答案,您可以找到步骤
如何使用带有Objective-C的IB_DESIGNABLE可视化情节提要中的可重用xib?
<meta\s+property=\"og:updated_time\"\s+content=\"([^"]+)\"
)XibViewHolder
)MyView.xib
XibViewHolder
UIView
的班级设置为UIView
的班级XibViewHolder
的名为Nib Name的Interface Builder属性(在Xib持有人类中定义)设置为要加载的Xib的名称,例如:UIView
。这是MyView
XibViewHolder.h
这是IB_DESIGNABLE
@interface XibViewHolder : UIView
@property (nonatomic, strong) UIView* contentView;
@property (nonatomic, strong) IBInspectable NSString* nibName;
@end
XibViewHolder.m