NSViewController & Interface Builder

4
我有一个简单的项目,它包括一个窗口和来自NSViewController的一个视图 (请参阅http://i.stack.imgur.com/UAn6L.png)。
该视图由我的自定义视图控制器对象进行管理(+链接,见截图)。
我将ViewController对象拖入MainMenu.xib中,连接了view outlet并设置了Controller-Class + Nib-Name。
当我启动应用程序时,我的自定义视图不会显示在窗口中("awakeFromNib"在我的自定义NSViewController子类中被调用!)。
请参见IB详细信息的屏幕截图->http://i.stack.imgur.com/UAn6L.png 你有什么想法我可能漏掉了什么?
2个回答

3

我假设您有一个名为CustomImageView的单独的Nib,它没有显示出来(由Xcode自动创建的那个)。在这种情况下,您将向该单独的Nib中的视图添加控件和绘图代码。要将该视图控制器的视图实际添加到窗口中,您需要通过从AppDelegate到视图控制器进行IBOutlet连接,并在您想要添加视图时添加以下代码(通常在applicationDidFinishLaunching:中):

[viewController.view setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
[viewController.view setFrame:NSInsetRect([window.contentView bounds], 20, 20)];
[window.contentView addSubview:viewController.view];

那将使它像你在截图中看到的那样居中并嵌入。问题是,通过在你的MainMenu Nib中创建view连接,你覆盖了独立的CustomImageView Nib中的连接。你可以删除窗口中的Custom View对象...你将不得不以编程方式添加自定义视图。如果它能这样工作就太好了,但它并没有。

编辑:

这是因为nibs被解档的顺序。首先实例化CustomImageView,并进行所有连接。此时正确设置了view属性。然后MainMenu再次连接view属性,覆盖了单独Nib中的view属性。现在view属性不正确。这是正常行为。如果你使用单独的nib,你必须保持未连接状态,在代码中添加视图控制器的视图。

另一种选择是不使用单独的Nib。只需从项目中删除它,在窗口中设置你的view,并保持你的连接不变。现在你可以有一个单独的视图控制器管理它,而无需添加任何代码。只有当视图非常复杂或用户可以选择主窗口的不同视图时,你才真正需要一个单独的Nib。


谢谢Francis!关于为什么CustomImageViewController.m视图属性(连接到CustomImageViewController.nib中的视图)会被MainMenu.nib中的连接覆盖,还有更多信息吗? - user1114537
我已经在我的答案中添加了一些解释。除非您的应用程序比它看起来更复杂,否则您可能不想在这种情况下使用单独的 Nib。您应该能够在 MainMenu 中设计所有内容。 - Francis McGrew

1

我删除了之前的回答,因为我以为你是在开发iOS设备。现在我意识到这是一个标准的Mac OS项目。但无论如何,我关于设置初始视图控制器的说法仍然适用。好的,你有一个自定义的NSViewController对象,它有一个NSView对象。直到这里都很好。但是,当应用程序启动时,应该如何知道显示哪个视图?你应该将初始视图设置为NSViewController的视图或将初始视图控制器设置为NSViewController对象本身,以便它知道在启动时要显示什么。如果你的项目很简单,我想看看它。只需将它发送到我的电子邮件。


嗨,Mikayil,这里是示例项目的链接。NSViewController子类来自苹果公司的示例,SPAppDelegate.m/.h基本上是vanilla XCode模板。我只是修改了MainMenu.xib。链接:http://www.mediafire.com/?fodletn93e1ykub - user1114537
亲爱的@bustaa,非常抱歉上传修改后的代码这么晚,但我一直很忙,没有时间。虽然我毫不怀疑你已经解决了问题,但出于礼貌,这里是修复后项目的链接:mediafire.com/?f10km6w8ww9eo9r 我只是在applicationDidFinishLaunching方法中添加了一些代码。 - Mikayil Abdullayev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接