如何从其他类(NSViewController的子类)获取主窗口(App Delegate)?

Use*_*234 20 macos cocoa objective-c

我试图改变我的Windows内容,从其他类,这是NSViewController的子类.我正在尝试下面的代码,但它没有做任何事情.

[NSApplication sharedApplication]mainWindow]setContentView:[self view]]; //code in NSViewController

[NSApplication sharedApplication]mainWindow] // returns null
Run Code Online (Sandbox Code Playgroud)

我试着补充一下

[window makeMainWindow];
Run Code Online (Sandbox Code Playgroud)

在App Delegate类中,但它无济于事.

我错过了什么?

PS我也在使用下面的代码来调用我班级中的任何委托函数,

 [(appDelegate *) [[NSApplication sharedApplication]delegate]MyMethod];
Run Code Online (Sandbox Code Playgroud)

但我想知道有没有更好的东西,没有导入委托类.像这样的东西

[[NSApplication sharedApplication]delegate]MyMethod];
Run Code Online (Sandbox Code Playgroud)

(它发出警告)

Mau*_*lly 37

对于mainWindow方法,文档说:

如果应用程序的nib文件尚未完成加载,接收者未处于活动状态,或者应用程序被隐藏,则此方法可能返回nil.

我刚刚创建了一个快速测试应用程序,我放置了以下代码:

NSLog(@"%@", [[NSApplication sharedApplication] mainWindow]);
Run Code Online (Sandbox Code Playgroud)

进入我的applicationDidFinishLaunching:aNotification方法,并进入一个动作方法,我连接到我的应用程序的主窗口中的按钮.

在启动时,它mainWindow是零,但当我点击按钮(一切都启动并运行并显示)后,mainWindow不再是零.

NSApplication 提供您可能对您有用的其他方法:

  • - windows - 所有窗户的阵列;
  • – keyWindow - 给出接收键盘输入(或零)的窗口;
  • – windowWithWindowNumber: - 返回与窗口编号对应的窗口 - 如果您知道要替换其内容的窗口编号,则可以使用此窗口;
  • – makeWindowsPerform:inOrder: - 向每个窗口发送消息 - 您可以使用它来测试每个窗口,看看它是否是您感兴趣的窗口.

关于调用方法delegate,你说什么给我一个警告.例如,这没有警告:

NSLog(@"%@", [[[NSApplication sharedApplication]delegate] description]);
Run Code Online (Sandbox Code Playgroud)

你收到的警告究竟是什么?你试图调用一个不存在的方法吗?


Bor*_*rzh 19

与MacOS战斗只是想出来了.

Apple的报价:

主窗口

属性

应用程序的主窗口.(只读)

讨论

当应用程序的故事板或nib文件尚未完成加载时,此属性中的值为nil.当应用程序处于非活动状态隐藏状态时,它也可能是零.

如果您的应用程序中只有一个窗口(这是最常用的情况),请使用下一个代码:

NSWindow *mainWindow = [[[NSApplication sharedApplication] windows] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

承诺它不会是零,如果应用程序有窗口.