Xcode如何决定首先显示哪个XIB?

7
当我在Xcode中创建一个新的Cocoa项目时,它会创建一个带有窗口的MainMenu.xib文件。我想将窗口分离到MainWindow.xib中,并将其显示为主窗口 - 我该如何操作?
如果我创建一个'文档'为基础的应用程序 - 我可以看到两个xib文件(MainMenu.xib和MyDocument.xib),并且我注意到MyDocument.xib会立即显示出来 - 但是我不知道这是在哪里确定的。似乎没有显式的代码,而且我不确定在plist文件中该去哪里查找。
如果我创建一个新的文档,如何使其成为启动应用程序时出现的主要窗口?

1
Xcode并不决定这样的事情,因为Xcode不会显示xibs(除了作为您组树中的项目)。Nibs无论如何都不能显示;它们是对象的存档。请参见http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html和http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/WinPanel/。 - Peter Hosey
谢谢,彼得。我不怀疑你说的话-但我觉得你忽略了潜在的问题。如何以及什么标识可以立即启动哪个窗口?该应用程序是一个NSApplication。Main nib被标识为MainMenu...然后我迷失了。"MyDocument"有什么特别之处,导致它立即打开?我如何打开其中的5个?我正在寻找实际配置确定应用程序启动时显示内容的答案。你提到的文档对于XIB非常好...但我找不到指导我识别启动窗口属性的部分。 - Luther Baker
2个回答

10
<YourProjectName>-Info.plist文件中,您会找到键“Main nib file base name”,其值通常为要加载的第一个xib的名称(一般为"MainMenu")。
此外,在“文档类型”->“项目0”->“Cocoa NSDocument Class”中,您会发现“MyDocument”的值。在类“MyDocument”中,有一个方法- (NSString *)windowNibName,此方法返回要加载的第一个xib的名称。

谢谢Viking。所以,当我查看“主nib文件基本名称”时...它说“MainMenu”。我知道我需要一个菜单 - 所以改变这个不会帮助我,对吧? - Luther Baker
文档类型中有三个不同的条目:(二进制、SQLite 和 XML)。它们每个都有“Cocoa NSDocument Class = MyDocument”。如果它们中的每一个使用不同的类,会发生什么?哪一个会自动加载?我看到了三件事情,但不清楚哪一个实际上首先被加载。 - Luther Baker
还有,如果我没有基于文档的应用怎么办?比方说我使用Core Data创建了一个基本应用。该应用有一个MainMenu.xib文件,其中包含菜单和主窗口。我想将主窗口分离出来,并在应用启动时自动加载和显示它 - 我该如何在Interface Builder中指定它? - Luther Baker
我刚刚注意到,在基于文档的应用程序中没有AppDelegate,但是在其他情况下确实存在。在非文档型应用程序中是否需要应用委托?如果是这样,我已经知道如何创建一个XIB来连接应用委托和应用程序,并包含一个窗口......但这是否会覆盖自动发生在基于文档的应用程序中的任何魔法呢?我是否可以在非文档型应用程序中以某种方式使用其中的一些魔法,还是我应该按照App Delegate的路线走? - Luther Baker

3

窗口管理是您的责任。不要依赖框架以任何顺序显示窗口,因为该顺序未定义。

首先,请确保在Interface Builder中未选中您的窗口的“Visible at Launch”复选框。如果选中了,则无法有效地控制窗口显示。它默认为开启状态。

接下来,为您想要加载的每个窗口nib使用一个NSWindowController子类。然后,在您的主应用程序控制器中,您可以控制这些NSWindowController对象何时实例化以及何时调用它们的-showWindow方法。

在您的示例情况下,您可能会在应用程序委托的-applicationDidFinishLaunching:方法中实例化MainWindow.xib的NSWindowController。


为什么这个答案被踩了?如果您踩了,请留下评论,谢谢。 - Rob Keniger
我真的很想在这里了解更多关于IB的知识 - 并不是要求最佳实践...虽然,根据你的观点,也许使用Interface Builder来实例化初始窗口并不明智。无论如何,我只是想确切地了解IB是如何做到的。 - Luther Baker
如果您在IB中打开MainMenu.xib并查看窗口的属性检查器,您会注意到Visible at Launch已被选中。这就是为什么应用程序启动时窗口会出现的原因。 MainMenu.xib默认加载,因为它在应用程序的Info.plist文件中指定为主要nib。 - Rob Keniger
嗨,罗布。听起来很直观 - 但不幸的是,这并不是真的。Xcode版本3.2.5,文件>>创建新项目,Cocoa应用程序,[x]创建基于文档的应用程序,[x]使用核心数据进行存储,选择,给它一个名称,将其保存在任何地方。您会发现两个XIB(MyDocument.xib和MainMenu.xib)。MainMenu.xib没有任何选项可以选择Visible at Launch。复选框在属性/行为选项卡上不存在。打开MyDocument.xib,'Visible at Launch'存在于属性/行为中...但未被选中。这两个XIB都会在编译和运行应用程序时显示。 - Luther Baker
是的 - 我确实理解为什么MainMenu.xib被加载和显示(NSMainNibFile属性) - 但我的问题实际上是关于MyDocument.xib以及它如何自动显示。 "如果我创建一个基于'document'的应用程序 - 我会看到两个xib文件(MainMenu.xib和MyDocument.xib),我注意到MyDocument.xib立即被显示出来 - 但我不明白这是在哪里确定的。" - Luther Baker
显示剩余3条评论

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