NSViewController没有被创建

时间:2012-02-04 22:17:02

标签: objective-c cocoa nsviewcontroller

我正在使用带有xib的一个主窗口控制器构建一个cocoa应用程序。该xib包含许多自定义视图类。我想在xib中添加一个NSViewController,但是我遇到了一些麻烦。

在界面构建器中,我可以将NSViewController拖到xib中,为其分配自定义控制器类,并将其视图分配给xib中的相应视图。问题在于:initWithNibName:Bundle:loadView都没有被调用。

我错过了什么?

修改 人们似乎误解了这个问题所以我会澄清。

窗口已有视图控制器。我想要做的是为几个子视图分配单独的视图控制器。我需要知道如何将我的NSViewController子类与适当的NSView子类(它是主窗口的子类)相关联。

或者换句话说,我试图使用多个NSViewController子类来控制单个.xib文件中的许多不同的自定义视图(每个一个)。那些控制器和子视图都有自己的.xibs,最终应该在同一个窗口中可见。

2 个答案:

答案 0 :(得分:1)

我用于NSViewController的模式是每个视图控制器都有一个xib。然后,当您需要该视图控制器时,alloc它并使用initWithNibName:Bundle:方法。一旦您使用其视图,loadView将被调用。

示例:

self.editViewController = [[[MyEditViewController alloc] initWithNibName:@"MyEditViewController" bundle: nil] autorelease];
[self.window setContentView: editViewController.view];

答案 1 :(得分:0)

我曾经也被这个问题困住了,放弃了那个东西 - 蓝色的圆圈,在IB调色板中有一个带有白色边框的视图。我现在从代码创建我的控制器,并且只通过文件所有者在IB中将引用设置为拥有控制器类:右键单击文件所有者,在Identity检查器中输入类名,然后从文件的所有者视图连接到图。

在您的代码中,您可以在适当的初始化点执行操作:

[self setMyViewController = [[MyViewController alloc] initWithNibName: @"MyView" bundle: [NSBundle mainBundle]]

对于您的具体情况,当您的窗口从其笔尖加载并准备工作时,可以使用windowDidLoad方法。然后,您可以将视图添加到Windows内容视图中。您也可以考虑在视图和视图控制器之间建立1:1的关系。它使维护方面的生活变得更加轻松。

编辑:像@pcperini在他的评论中建议您可以使用调色板组件,但您仍需要在代码中实例化控制器。如果要使用调色板组件,请在主控制器或AppDelegate中创建属性:

@property (...) MyViewController *myViewController;

添加代码行以实际创建控制器(参见上文)。然后,使用绑定检查器将调色板组件绑定到myViewController属性。

所以,你缺少的是你实际上没有实例化控制器对象。

编辑2:这是代码(awakeFromNib是顶级控制器的方法)。它创建了两个子控制器,每个子控制器处理不同的子视图:

- (void) awakeFromNib {

    [[self startEndTopicHeader] setHeader: @"Event timeline boundary"];
    [[self startDateHeaderView] setHeader: @"Event (start) date"];
    [[self endDateHeaderView] setHeader: @"Event end date"];

    [self setStartDateViewController: [[EventTimeViewController alloc] initWithNibName: @"EventTimeView" bundle: [NSBundle mainBundle]]];
    [[[self startDateViewController] view] setFrame: [[self dummyStartView] bounds]];
    [[self dummyStartView] addSubview: [[self startDateViewController] view]];
    [[self startDateViewController] setParentController: self];

    [self setEndDateViewController: [[EventTimeViewController alloc] initWithNibName: @"EventTimeView" bundle: [NSBundle mainBundle]]];
    [[[self endDateViewController] view] setFrame: [[self dummyEndView] bounds]];
    [[self dummyEndView] addSubview: [[self endDateViewController] view]];
    [[self endDateViewController] setParentController: self];

}
相关问题