2014-05-22 64 views
2

比方说,我有一个XIB文件(MyView.xib)包含一个单一的根UIView的类是一些自定义的UIView子类(MyView)。实例化自己作为文件所有者的XIB文件中的UIView?

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

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

我想是这样的MyView的里面执行:

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

然后我意识到是没有意义的,因为在这一点上self是零,因此该文件的所有者设置为无(没有好)。

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

我又试图这样的事情:

- (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; 
} 

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

我失去了一些东西明显?或者我的理解有某种缺陷?

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

欢迎任何和所有建议。

回答

2

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

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

这是我结束了去初始化:

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

这似乎是现在的工作很好。

UPDATE

我已经创建UIView的一个类别从XIBs(它假定XIB名称相同的类名)初始化意见。

的UIView + Initialization.h

#import <UIKit/UIKit.h> 

@interface UIView (Initialization) 

- (instancetype)initFromNib; 

@end 

的UIView +初始化。米

#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的。

+0

当我将IB中的Xib的文件所有者设置为CustomClass时,这不起作用。相反,人们应该将视图设置为xib中的自定义类,我相信就是这样。 – stackOverFlew

+0

请参阅http://stackoverflow.com/a/33711143/1392515 – stackOverFlew

+0

你知道在这种情况下MyView类是否能够接收UI事件?那么如果我的观点有一个IBAction,它会被恰当地调用?从我的理解事件发送到文件的所有者。 –

相关问题