我正在构建一个可可应用程序与一个主窗口控制器与一个xib。xib包含许多自定义视图类。我想在xib中添加一个NSViewController,但是我遇到了一些麻烦。
在接口构建器中,我可以将NSViewController拖到xib中,指定它的自定义控制器类,并将其视图分配给xib中的适当视图。问题是:initWithNibName:Bundle:或loadView都没有被调用。
我遗漏了什么?
编辑:的人似乎误解了这个问题,所以我会澄清。
该窗口已经有一个视图控制器。我想要做的是为几个子视图分配单独的视图控制器。我需要知道如何将我的NSViewController子类与适当的NSView子类(它是主窗口的子类)相关联。
换句话说,我试图使用多个NSViewController子类来控制单个.xib文件中的许多不同的自定义视图(每个视图一个)。这些控制器和子视图有自己的.xibs,最终应该在同一个窗口中可见。
发布于 2012-02-05 00:59:49
我为NSViewController使用的模式是每个视图控制器都有一个xib。然后,当您需要该视图控制器时,您可以将其alloc并使用initWithNibName:Bundle:方法。一旦您使用它的视图,loadView就会被调用。
示例:
self.editViewController = [[[MyEditViewController alloc] initWithNibName:@"MyEditViewController" bundle: nil] autorelease];
[self.window setContentView: editViewController.view];发布于 2012-02-05 01:01:34
我以前也被困在那里,放弃了那个东西--从IB调色板上看到一个白色边缘的蓝色圆圈。我现在从代码中创建控制器,并且只在IB中通过文件所有者设置对拥有控制器类的引用:右键单击文件所有者,在标识检查器中输入类名,然后从文件所有者视图连接到视图。
然后,在您的代码中,在适当的初始化点执行以下操作:
[self setMyViewController = [[MyViewController alloc] initWithNibName: @"MyView" bundle: [NSBundle mainBundle]]对于您的具体情况,这可能是在windowDidLoad方法中,当您的窗口从它的nib加载并准备工作时。然后,可以将该视图添加到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];
}https://stackoverflow.com/questions/9145088
复制相似问题