从笔尖加载视图

时间:2012-03-03 11:58:30

标签: iphone nib

我一直在努力解决这个问题,我认为解决方案非常简单,但我无法做到这一点。我有一个UIViewController,它有自己的视图,现在我想添加一个子视图。应该从笔尖加载子视图。我按照here描述的步骤,即:  1.创建MyView类,它是UIView的子类  2.在MyView中声明IBOutlet属性  3.创建.xib文件,其中File Owner设置为UIViewController,View类设置为MyView
 4.连接插座
 5.在MyViewControllerviewDidLoad方法:

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
MyView *mView;
for (id view in nibViews) {
   if ([view isKindOfClass:[MyView class]]) {
      mView = (MyView*) view;   
    }
}
[self.view addSubview:mView];

mView已成功加载,但当我尝试将其添加为子视图时,我获得了EXC_BAD_ACCESS。我甚至添加了mView = [(MyView*) view retain];,但这没有帮助。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

别担心......

您不需要再单独使用nib文件并引用myView类。只需将UIView从库中拖动到当前的viewController的xib中,然后就可以将视图从当前视图连接到xib。

见下图:enter image description here

答案 1 :(得分:1)

我不确定你的观点3:

制作.xib文件,其中File Owner设置为UIViewController,View类设置为MyView

文件所有者不应该是uiviewcontroller,而是MyView类

答案 2 :(得分:1)

在我的情况下,我不希望我的视图控制器从我的视图的.xib中了解IBOutlets。我希望我的视图子类拥有IBOutlets。不幸的是,UIView没有initWithNibName:方法,因此我只创建了自己的类别。

这就是我的所作所为:

  • 在IB中,单击您的主UIView,并在Identity Inspector中,将类设置为您的子类
  • 在IB中,单击文件所有者,然后在Identity Inspector中将类设置为您的子类
  • 使用新的类别方法initWithNibName:来实例化您的视图。

这是我创建的类别:

- (instancetype)initWithNibName:(NSString *)nibName
{
    NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil];
    if (arrayOfViews.count < 1) {
        return nil;
    }

    self = arrayOfViews[0];

    return self;
}

this post的启发。

请注意,到目前为止,帧会自动调整,因此与帖子中的代码不同,我还没有明确设置帧。 此外,与帖子的代码不同,我需要设置owner:self,以便IBOutlets正确连接。