在StoryBoard的ViewController中使用UIView加载Nib

til*_*tem 20 iso uiviewcontroller uiview nib uistoryboard

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

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

Ant*_*nko 18

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

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


- (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.

有快乐的编码

编辑

我想要注意,根据awakeFromNib 文档,我们应该避免使用这些代码awakeFromNib.

建议您在File的Owner对象及其关联的nib文件之间保持一对一的对应关系.使用相同的File的Owner对象加载两个nib文件会导致该对象的awakeFromNib方法被调用两次,这可能导致某些数据结构以不希望的方式重新初始化.还建议您避免从awakeFromNib方法实现中加载其他nib文件.

  • 这很少被描述,但非常有价值的解释.我喜欢它.这里提到了相同的方法:http://onedayitwillmake.com/blog/2013/07/ios-creating-reusable-uiviews-with-storyboard/ (2认同)

小智 10

命名您的视图ViewInNib,然后我们有:

  1. ViewInNib.h
  2. ViewInNib.m
  3. ViewInNib.xib

在你的故事板中,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;
}
Run Code Online (Sandbox Code Playgroud)

在这个方法中,我们用storyboard中的视图替换从nib加载的实际视图.希望能帮助到你.