如何从代码加载nib文件?

时间:2011-05-15 17:49:39

标签: cocoa nsview

我在界面构建器中创建了一个自定义视图,其中包含几个按钮。我在代码中创建了一个类作为“文件所有者”,将按钮连接到操作方法。

我如何使用这个课程?

我不能这样做......

StartScreen *ss = [[StartScreen alloc] initWithFrame: ...];
[self.window.contentView addSubView: ss];
...

因为这只会产生一个空视图。 (当然:StartScreen类对nib文件还不了解。)

我想做的是:

StartScreen *ss = LoadCustomViewFromNib(@"StartScreen");
[self.window.contentView addSubView: ss];

或者我可能要说类似

[self iWannaBeANibWithName: @"StartScreen"];

在StartScreen的构造函数中?

请帮忙...... (顺便说一句,我正在为Mac OS X 10.6开发)

2 个答案:

答案 0 :(得分:4)

一种选择是使StartScreen成为NSViewController的子类,可能会将其名称更改为StartScreenController。如果你的nib文件中有IBActions和/或你想将视图控制代码放在它自己的类中,这是一个可能更模块化的解决方案。

  1. StartScreenController声明为NSViewController
  2. 的子类
  3. 如果需要,在IBOutlets中声明StartScreenController
  4. 将nib文件的所有者类设置为StartScreenController
  5. 将文件的所有者view插座连接到视图对象,并根据需要连接其他插座
  6. 然后:

    StartScreenController *ss = [[StartScreenController alloc] initWithNibName:@"nibname" bundle:nil];    
    [self.window.contentView addSubView:ss.view];
    …
    

    如果您没有使用垃圾收集,请不要忘记在不再需要时释放ss

答案 1 :(得分:2)

Nib加载函数是NSBundle类的一部分。你可以像这样使用它......

@implementation StartScreen
- (id) init {
    if ((self = [super init])) {
        if (![NSBundle loadNibNamed:@"StartScreen" owner:self])
            // error
        // continue initializing
    }
    return self;
}

请参阅NSBundle Additions reference