2012-02-04 50 views
0

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

在界面生成器我可以拖动NSViewController到XIB,分配给它的定制控制器的类,并分配其以便在XIB相应的视图。问题在于:initWithNibName:Bundle:loadView都不会被调用。

我错过了什么?

编辑: 人似乎都在误解的问题,所以我会澄清。

窗口已经有一个视图控制器。我正在寻找的是将几个独立的视图控制器分配给几个子视图。我需要知道如何将NSViewController子类与适当的NSView子类(它是主窗口的子类)相关联。或者换句话说,我试图使用多个NSViewController子类来控制单个.xib文件中的许多不同的自定义视图(每个视图各一个)。这些控制器和子视图都有自己的.xibs,最终应该在同一个窗口中显示。

+0

从什么引用'NSViewController'? – 2012-02-04 22:18:55

+0

我将它添加到xib文件(拖放),然后将其类分配给我使用IB创建的类。右侧有一个选项卡,可让您设置其“文件所有者”。 – mtmurdock 2012-02-04 22:21:55

+0

没错,但是如果你只是在'xib'中的任何地方放置一个对象,它不一定会渲染,特别是像'NSViewController'这样的非View对象。你必须从代码实例化NSViewController(在这种情况下,你的'xib'将把它作为'File's Owner'来引用它),或者把它设置成你的ApplicationDelegate的'window'的'rootViewController' 。 – 2012-02-04 22:27:30

回答

1

我使用NSViewController该图案是具有每视图控制器XIB。然后,当你需要这个视图控制器时,你可以使用alloc它并使用initWithNibName:Bundle:方法。只要你使用它的视图,loadView将被调用。

例子:

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

这不是我的问题,我试图为子视图创建视图控制器。 – mtmurdock 2012-02-06 21:57:26

+0

@mtmurdock您是否检查过您拖入xib的控制器组件实际上是否包含您的控制器实例? – Roger 2012-02-06 22:05:46

0

我用坚持与如拿,放弃了那个东西 - 蓝色圆圈在它从IB调色板白色边框的视图。我现在从代码创建我的控制器,并且只通过文件所有者在IB中设置一个引用到拥有的控制器类:右键单击文件所有者,在“身份”检查器中输入类名称,然后从文件的所有者视图连接到视图。

在你的代码,那么你在适当的初始化点事:

[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]; 

}