【发布时间】:2014-02-03 13:12:10
【问题描述】:
我有一个要在多个视图控制器中使用的 UIView,因此我为它创建了视图 (.h/.m) 和一个 nib 文件。在 Storyboard 中,视图作为子视图添加到视图控制器,但未加载 nib 中定义的布局。
是否可以为 Storyboard 的视图控制器中使用的 UIView 加载 nib?
【问题讨论】:
标签: uiview uiviewcontroller uistoryboard nib iso
我有一个要在多个视图控制器中使用的 UIView,因此我为它创建了视图 (.h/.m) 和一个 nib 文件。在 Storyboard 中,视图作为子视图添加到视图控制器,但未加载 nib 中定义的布局。
是否可以为 Storyboard 的视图控制器中使用的 UIView 加载 nib?
【问题讨论】:
标签: uiview uiviewcontroller uistoryboard nib iso
如果您在编辑 Storyboard 时询问在 Interface Builder 中查看 .xib 内容,这是不可能。但如果您需要在运行时加载它,有可能。
@property (strong, nonatomic) IBOutlet UIView* view; 并将您的 View 容器从 Interface Builder 连接到此字段(Ctrl + 单击 在 View 上并将连接拖到上方 view .h 中的属性
- (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];
}
}
就是这样。将 View 移至 Storyboard 场景,将 Custom Class 更改为您的 FooView,在 View Controller 代码中导入 .h 并使用 IBOutlets 随心所欲。
祝你编码愉快
编辑
我想注意,根据awakeFromNibdocumentation,我们应该避免awakeFromNib 中的此类代码。
建议您在文件所有者对象与其关联的 nib 文件之间保持一对一的对应关系。使用相同的 File's Owner 对象加载两个 nib 文件会导致该对象的 awakeFromNib 方法被调用两次,这可能会导致某些数据结构以不希望的方式重新初始化。还建议您避免从 awakeFromNib 方法实现中加载其他 nib 文件。
【讨论】:
将您的视图命名为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;
}
在这种方法中,我们将从 nib 加载的真实视图替换为情节提要中的视图。希望对您有所帮助。
【讨论】:
【讨论】: