2012-03-03 248 views
1

我一直在为此苦苦挣扎了一段时间,我认为解决方案非常简单,但我无法做到正确。我有一个UIViewController,它有它的视图,现在我想添加一个子视图到它。子视图应该从一个笔尖加载。我遵循的步骤描述here,即:
1.创建MyView类,这是UIView的
2的子类MyView
3.进行的.xib文件,其中文件所有者设置为UIViewController中声明IBOutlet中的属性和视图类设置为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];但这并没有帮助。

我在做什么错?

回答

1

我不知道你的观点3:

做的.xib文件,其中文件的所有者设置的UIViewController和View类设置为MyView的

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

+0

你说得对 - 我是按照被引用的SO回答中的步骤操作的。不敢相信我没有早点认识到它。感谢名单 – Maggie 2012-03-03 12:41:29

2

不要担心......

你并不需要采取单独的榫文件并再次引用到MyView的类。只需将UIView从库中拖到当前的viewController的xib中,然后就可以将视图从当前视图连接到xib。

见下面的图片:enter image description here

+0

现在你可以创建。h as:IBOutlet UIView * myView;然后在你想要的时候添加它。任何疑问,请告诉我。 – 2012-03-03 12:27:29

+0

dis是最简单的方法 – 2012-03-03 13:04:16

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才能正确连线。