如何在另一个窗口内加载笔尖?
我尝试过initWithWindowName,
if (mmController == NULL)
mmController = [[mainMenu alloc] initWithWindowNibName:@"mainMenu"];
[mmController showWindow:self];
但它会打开一个新窗口。
我也尝试过loadNibNamed
[NSBundle loadNibNamed:@"mainGame" owner:self];
并且它成功了,但是当我尝试使用相同的方法返回主菜单时,
[NSBundle loadNibNamed:@"mainMenu" owner:self];
它不起作用。它什么都不做...... 有什么想法吗?
答案 0 :(得分:8)
我尝试过initWithWindowName,
你的意思是initWithWindow¹Nib²Name³:
,它取一个包含窗口(1)的笔尖(2)的名称(3)。
if (mmController == NULL)
这应该是nil
,而不是NULL
,因为您正在比较Objective-C对象指针。
mmController = [[mainMenu alloc] initWithWindowNibName:@"mainMenu"];
这里mainMenu
是什么?它必须是一个类,但什么是它的子类?
[mmController showWindow:self];
从这条消息和上一条消息中,我猜测mainMenu
是NSWindowController的子类。
不应该要求猜测。你应该专门命名你的类,这样任何人都可以告诉你什么是类,它的实例只是通过类名。
简洁是一种美德,但如果你需要做多久,那就去吧。我们有名称完成的现代工具。 tab键可以消除缩写名称的唯一优势。
但它会打开一个新窗口。
是。您通过从笔尖加载窗口创建了一个窗口,然后告诉窗口控制器显示该窗口。显示一个新窗口是预期的结果。
我也尝试过loadNibNamed
[NSBundle loadNibNamed:@"mainGame" owner:self];
并且它成功了,但是当我尝试使用相同的方法返回主菜单时,
没有“回来”。加载nib只是通过从归档中加载它们来创建对象。您可以多次加载相同的笔尖,并且加载笔尖不会以某种方式撤消加载前一个笔尖的结果。
您可能需要阅读Resource Programming Guide,其中包括笔尖以及图像和声音文件以及Bundle Programming Guide。
如果要隐藏从mainGame
笔尖加载的窗口,请执行此操作。 AppKit中的术语是“ordering out”(而不是“排序”,“ordering front”和“ordering back”是具体的做法)。
[NSBundle loadNibNamed:@"mainMenu" owner:self];
它不起作用。它什么都不做......
您是否尝试加载项目附带的MainMenu笔尖?如果是这样,请确保您的案例正确 - 您不希望您的应用程序因为区分大小写的卷运行它而被破坏,对于使用默认不区分大小写的人员,您也不希望它被破坏文件系统。
如果那不是你想要做的,那么你不清楚你想要做什么。 MainMenu通常是包含主菜单的nib(菜单栏的内容);命名任何其他笔尖“mainMenu”或类似的东西最多会导致混乱和最坏的问题。如果这应该是其他一些笔尖,你应该给它一个不同的名字。
无论哪种方式,这都不是你需要做的。如果要隐藏从mainGame
加载的窗口,则需要隐藏该窗口,而不是加载不同的笔尖。
此外,一旦窗口加载,请不要再次加载(除非您关闭并释放它)。加载后,您可以直接将其重新订购。最有可能的是,您需要同时make it key and order it front。
在Mac上,您不仅限于一个窗口;实际上,无论你做什么,你的应用程序都有多个窗口(至少三个)。 API是围绕您显示多个窗口的能力而构建的。
有关详细信息,请参阅Window Programming Guide。
如何在另一个窗口内加载笔尖?
正如Justin Meiners已经告诉过你的那样,你可能需要NSViewController,尽管你可以不用,只需使用loadNibNamed:
直接加载包含视图的笔尖。
警告NSViewController不如Cocoa Touch的UIViewController强大/功能强大。
您需要阅读View Programming Guide。