在StoryBoard的ViewController中使用UIView加载Nib

时间:2014-01-15 07:09:45

标签: uiview uiviewcontroller uistoryboard nib iso

我有一个UIView,我想在几个视图控制器中使用,所以我为它创建了视图(.h / .m)和一个nib文件。在Storyboard视图中添加为视图控制器的子视图,但未加载nib中定义的布局。

是否可以为故事板中视图控制器中使用的UIView加载nib?

3 个答案:

答案 0 :(得分:18)

如果您在编辑Storyboard时询问在Interface Builder中查看.xib内容,则无法。但是如果你需要在运行时加载它,可能

  • .h / .m 应包含 UIView 子类
  • .xib 文件中,您需要使用自定义UIView子类设置文件所有者 Identity Inspector - >自定义类
  • .h 文件中添加@property (strong, nonatomic) IBOutlet UIView* view;并将View容器从Interface Builder连接到此字段( Ctrl +单击在View上并将连接拖到上面{ .h
  • 中的{1}}属性
  • 将其他子视图连接到 .h
  • .m 文件中,您需要放置

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命名,然后我们有:

  1. ViewInNib.h
  2. ViewInNib.m
  3. ViewInNib.xib
  4. 在你的故事板中,在视图控制器中放置一个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)

使用XXNibBridge:

https://github.com/sunnyxx/XXNibBridge

超级简单易用,也适用于Swift。 完全归功于@sunnyxx