从XIB文件实例化一个UIView作为文件的所有者?

比方说,我有一个XIB文件(MyView.xib)包含一个单一的根UIView其类是一些自定义的UIView子类(MyView)。

我想从XIB文件创buildMyView的实例(在代码中),但我也希望文件的所有者是MyView的实例(这样我可以将IBOutlets从XIB链接到代码)。

换句话说,MyView是XIB中的根视图的类,它也被设置为文件的所有者类。

我在MyView实现中尝试了这样的事情:

- (id)initFromNib { self = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] firstObject]; return self; } 

然后我意识到这是没有道理的,因为那时候self是零,所以文件的所有者被设置为零(不好)。

这开始感觉像鸡蛋问题,因为我需要文件的所有者是在创build之前即将创build的实例。

然后我尝试了这样的事情:

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:CGRectMake(0.0, 0.0, 310, 166)]; if (self) { self = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] firstObject]; } return self; } 

显然这只是一个临时的黑客,看看它是否会起作用,但是不行。 该视图被加载并正确显示,但是当我按下其中一个button(具有相关联的IBAction)时,该应用程序崩溃。

我错过了什么明显的? 或者是我的理解有某种缺陷?

一般的问题是,我只想拥有一个包含该视图的可视化表示的关联XIB的自定义UIView子类,并且还希望能够在XIB和其对应的UIView子类之间关联IBOutlets。

任何和所有的build议是受欢迎的。

经过一些挖掘,我发现了一个解决方法。 基本上,而不是将我的IBOutlets和IBActions链接到文件的所有者,我将它们直接链接到根视图的类(它具有通过自定义子类暴露的IB属性)。

关键是不依赖文件的所有者,而是直接将出口和动作连接到自定义视图。

这是我最终要做的初始化工具:

 - (instancetype)initFromNib { return [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:nil options:nil] firstObject]; } 

这似乎现在工作正常。

UPDATE

我已经在UIView上创build了一个用于从XIB初始化视图(它假定XIB名称与类名相同)的类别。

UIView的+ Initialization.h

 #import <UIKit/UIKit.h> @interface UIView (Initialization) - (instancetype)initFromNib; @end 

UIView的+ Initialization.m

 #import "UIView+Initialization.h" @implementation UIView (Initialization) - (instancetype)initFromNib { return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:nil options:nil] firstObject]; } @end 

你可以简单地做:

 MyView *myView = [[MyView alloc] initFromNib]; 

假设你有一个MyView.xib文件和一个根视图,其类是MyView。