我尝试了 initWithWindowName,
你的意思是initWithWindow¹Nib²Name³:
,它采用包含窗口 (1) 的笔尖 (2) 的名称 (3)。
if (mmController == NULL)
这应该是nil
, not NULL
,因为您正在比较 Objective-C 对象指针。
mmController = [[mainMenu alloc] initWithWindowNibName:@"mainMenu"];
What is mainMenu
这里?它一定是一个类,但它是什么的子类呢?
[mmController showWindow:self];
根据这条消息和上一条消息,我猜测mainMenu
是 NSWindowController 的子类。
不应该需要猜测。您应该专门命名您的类,以便任何人都可以仅通过类名就知道该类是什么及其实例。
简洁是一种美德,但如果你需要长篇大论,那就长篇大论。我们拥有具有名称补全功能的现代工具。 Tab 键可以消除缩写名称的唯一优势。
但它会打开一个新窗口。
是的。您通过从笔尖加载窗口来创建窗口,然后告诉窗口控制器显示该窗口。显示一个新窗口是预期的结果。
我也尝试过 loadNibNamed
[NSBundle loadNibNamed:@"mainGame" owner:self];
它成功了,但是当我尝试使用相同的方法返回主菜单时,
没有“回来”。加载笔尖只是通过从存档加载对象来创建对象。您可以多次加载同一个笔尖,并且加载笔尖不会以某种方式撤消加载前一个笔尖的结果。
您可能想阅读资源编程指南,其中涵盖笔尖以及图像和声音文件,以及捆绑编程指南.
如果您想隐藏从加载的窗口mainGame
笔尖,这样做。 AppKit 中的术语是“订购”(与“订购”相反,“前台订购” and “订购回来”是具体的做法)。
[NSBundle loadNibNamed:@"mainMenu" owner:self];
它不起作用。它根本没有任何作用...
您是否正在尝试加载项目附带的 MainMenu 笔尖?如果是这样,请确保您的大小写正确 - 您不希望您的应用程序因从区分大小写的卷运行它的人而被破坏,也不希望它被使用默认的不区分大小写的卷的人破坏。文件系统。
如果这不是您想要做的,那么就不清楚您想要做什么。 MainMenu 通常是包含主菜单(菜单栏的内容)的笔尖;将任何其他笔尖命名为“mainMenu”或类似名称,往好里说会引起混乱,往坏里说会出现问题。如果这是其他笔尖,您应该给它一个不同的名称。
无论哪种方式,这都不是您需要做的。如果您想隐藏加载的窗口mainGame
,那么您需要隐藏该窗口,而不是加载不同的笔尖。
此外,一旦窗口被加载,就不要再次加载它(除非您关闭并释放它)。加载后,您只需将其重新订购即可。很可能,您会想要两者使其成为关键并在前面订购.
在 Mac 上,您一次不仅限于一个窗口;事实上,无论您做什么,您的应用程序都有多个窗口(至少三个)。 API 是围绕您显示多个窗口的能力而构建的。
See the 窗口编程指南了解更多信息。
如何将笔尖加载到另一个窗口内?
正如 Justin Meiners 已经告诉你的那样,你可能需要 NSViewController 来实现这一点,尽管你可以不使用 NSViewController,直接使用加载包含视图的笔尖loadNibNamed:
.
请注意,NSViewController 并不像 Cocoa Touch 的 UIViewController 那样强大/有特色。
你会想阅读查看编程指南为了这。