我有一个UIView,我想在几个视图控制器中使用,所以我为它创建了视图(.h / .m)和一个nib文件。在Storyboard视图中添加为视图控制器的子视图,但未加载nib中定义的布局。
是否可以为故事板中视图控制器中使用的UIView加载nib?
答案 0 :(得分:18)
如果您在编辑Storyboard时询问在Interface Builder中查看.xib内容,则无法。但是如果你需要在运行时加载它,可能。
@property (strong, nonatomic) IBOutlet UIView* view;
并将View容器从Interface Builder连接到此字段( Ctrl +单击在View上并将连接拖到上面{ .h
view
这就是全部。移动查看故事板场景,将自定义类更改为 FooView ,在View Controller代码中导入.h并使用 IBOutlets 如你所愿。
快乐编码
修改强>
我想注意,根据
- (void)awakeFromNib {
NSString* nibName = @"Place here your Nib name without extension";
if ([[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil]) {
[self.view setFrame:[self bounds]];
[self addSubview:self.view];
}
}
documentation,我们应该避免awakeFromNib
中的此类代码。
建议您在File的Owner对象及其关联的nib文件之间保持一对一的对应关系。使用相同的File的Owner对象加载两个nib文件会导致该对象的awakeFromNib方法被调用两次,这可能导致某些数据结构以不希望的方式重新初始化。还建议您避免从awakeFromNib方法实现中加载其他nib文件。
答案 1 :(得分:10)
为您的观点ViewInNib
命名,然后我们有:
在你的故事板中,在视图控制器中放置一个placeholder
UIView组件,记得设置它的类ViewInNib
,然后在ViewInNib.m
中:
static BOOL isReplaced = NO;
- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder
{
if (!isReplaced)
{
isReplaced = YES;
ViewInNib *replaced = [[[NSBundle mainBundle] loadNibNamed:@"ViewInNib" owner:nil options:nil] lastObject];
replaced.frame = self.frame;
replaced.translatesAutoresizingMaskIntoConstraints = NO;
return replaced;
}
isReplaced = NO;
return self;
}
在这个方法中,我们用storyboard中的视图替换从nib加载的实际视图。希望它有所帮助。
答案 2 :(得分:4)