我一直在努力解决这个问题,我认为解决方案非常简单,但我无法做到这一点。我有一个UIViewController,它有自己的视图,现在我想添加一个子视图。应该从笔尖加载子视图。我按照here描述的步骤,即:
1.创建MyView
类,它是UIView的子类
2.在MyView
中声明IBOutlet属性
3.创建.xib文件,其中File Owner设置为UIViewController,View类设置为MyView
4.连接插座
5.在MyViewController
,viewDidLoad
方法:
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];
,但这没有帮助。
我做错了什么?
答案 0 :(得分:2)
别担心......
您不需要再单独使用nib文件并引用myView类。只需将UIView从库中拖动到当前的viewController的xib中,然后就可以将视图从当前视图连接到xib。
见下图:
答案 1 :(得分:1)
我不确定你的观点3:
制作.xib文件,其中File Owner设置为UIViewController,View类设置为MyView
文件所有者不应该是uiviewcontroller,而是MyView类
答案 2 :(得分:1)
在我的情况下,我不希望我的视图控制器从我的视图的.xib中了解IBOutlets。我希望我的视图子类拥有IBOutlets。不幸的是,UIView没有initWithNibName:
方法,因此我只创建了自己的类别。
这就是我的所作所为:
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正确连接。