在可可中加载笔尖

Cos*_*Kal 2 cocoa nib

如何在另一个窗口内加载笔尖?

我试过initWithWindowName,

if (mmController == NULL)
    mmController = [[mainMenu alloc] initWithWindowNibName:@"mainMenu"];
[mmController showWindow:self];
Run Code Online (Sandbox Code Playgroud)

但它打开了一个新窗口.

我也尝试过loadNibNamed

[NSBundle loadNibNamed:@"mainGame" owner:self];
Run Code Online (Sandbox Code Playgroud)

它成功了,但当我尝试使用相同的方法返回主菜单时,

[NSBundle loadNibNamed:@"mainMenu" owner:self];
Run Code Online (Sandbox Code Playgroud)

它不起作用.它什么都不做......有什么想法吗?

Pet*_*sey 8

我试过initWithWindowName,

你的意思是initWithWindow¹Nib²Name³:,它取一个包含窗口(1)的笔尖(2)的名称(3).

if (mmController == NULL)
Run Code Online (Sandbox Code Playgroud)

这应该是nil,NULL因为您正在比较Objective-C对象指针.

    mmController = [[mainMenu alloc] initWithWindowNibName:@"mainMenu"];
Run Code Online (Sandbox Code Playgroud)

这是什么mainMenu?它必须是一个类,但它的子类是什么?

[mmController showWindow:self];
Run Code Online (Sandbox Code Playgroud)

从这条消息和上一条消息,我猜mainMenu是NSWindowController的子类.

不应该要求猜测.你应该专门命名你的类,这样任何人都可以通过类名来分辨类和它的实例.

简洁是一种美德,但如果你需要做多久,那么就去做吧.我们有名称完成的现代工具.tab键可以消除缩写名称的唯一优势.

但它打开了一个新窗口.

是.您通过从笔尖加载窗口创建了一个窗口,然后告诉窗口控制器显示该窗口.显示新窗口是预期的结果.

我也尝试过loadNibNamed

[NSBundle loadNibNamed:@"mainGame" owner:self];
Run Code Online (Sandbox Code Playgroud)

它成功了,但当我尝试使用相同的方法返回主菜单时,

没有"回来".加载nib只是通过从归档中加载它们来创建对象.您可以多次加载相同的笔尖,并且加载笔尖不会以某种方式撤消加载前一个笔尖的结果.

您可能需要阅读资源编程指南,其中包括笔尖以及图像和声音文件,以及" 捆绑编程指南".

如果要隐藏从mainGame笔尖加载的窗口,请执行此操作.AppKit中的术语是"排序"(与"排序"相反,"排序前""排序后退"是具体的操作方式).

[NSBundle loadNibNamed:@"mainMenu" owner:self];
Run Code Online (Sandbox Code Playgroud)

它不起作用.它什么都不做......

您是否尝试加载项目附带的MainMenu笔尖?如果是这样,请确保您的案例正确 - 您不希望您的应用程序因为区分大小写的卷运行它而被破坏,对于使用默认不区分大小写的人员,您也不希望它被破坏文件系统.

如果那不是你想要做的,那么你不清楚你想要做什么.MainMenu通常是包含主菜单的nib(菜单栏的内容); 命名任何其他笔尖"mainMenu"或类似的东西最多会导致混乱和最坏的问题.如果这应该是其他一些笔尖,你应该给它一个不同的名字.

无论哪种方式,这都不是你需要做的.如果要隐藏加载的窗口mainGame,则需要隐藏该窗口,而不是加载不同的笔尖.

此外,一旦窗口加载,请不要再次加载(除非您关闭并释放它).一旦你加载它,你可以简单地重新订购它.最有可能的是,你会想要把它变成关键并在它前面订购.

在Mac上,您不仅限于一个窗口; 实际上,无论你做什么,你的应用都有多个窗口(至少三个).API是围绕您显示多个窗口的能力而构建的.

有关更多信息,请参见" 窗口编程指南"

如何在另一个窗口内加载笔尖?

正如Justin Meiners已经告诉过你的那样,你可能想要NSViewController,虽然你可以不用,只需加载包含视图的nib直接使用loadNibNamed:.

请注意,NSViewController并不像Cocoa Touch的UIViewController那样强大/功能强大.

您需要阅读View编程指南.