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

时间:2011-10-01 12:39:10

标签: objective-c macos cocoa

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

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

[NSApplication sharedApplication]mainWindow] // returns null

我尝试添加

[window makeMainWindow];

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

我错过了什么吗?

P.S。我也在使用下面的代码来调用我的类中的任何委托函数,

 [(appDelegate *) [[NSApplication sharedApplication]delegate]MyMethod];

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

[[NSApplication sharedApplication]delegate]MyMethod];

(它发出警告)

4 个答案:

答案 0 :(得分:37)

对于mainWindow method the docs say

  

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

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

NSLog(@"%@", [[NSApplication sharedApplication] mainWindow]);

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

在启动时,mainWindow为零,但是当我点击按钮(在所有内容都启动并运行并显示之后)时,mainWindow不再是零。

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

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

关于在delegate上调用方法,你所说的警告对我来说没问题。例如,这没有任何警告:

NSLog(@"%@", [[[NSApplication sharedApplication]delegate] description]);

你收到的警告究竟是什么?您是否尝试调用不存在的方法?

答案 1 :(得分:19)

与MacOS战斗只是想出来了。

Apple的报价:

  

主窗口

     

属性

     

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

     

讨论

     

当app的storyboard或nib文件尚未完成加载时,此属性中的值为nil。当应用无效隐藏时,它也可能为零。

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

NSWindow *mainWindow = [[[NSApplication sharedApplication] windows] objectAtIndex:0];

如果应用程序有窗口,则承诺它不会为零。

答案 2 :(得分:0)

如果尚未设置窗口属性,请尝试延迟应用程序,直到应用程序完成加载,如下所示:

[myObject performSelector:@selector(theSelector) withObject:nil afterDelay:0.1];

答案 3 :(得分:0)

用于获取主窗口的 Swift 风格的方法(如果存在)

应用程序主窗口

guard let window = NSApplication.shared.mainWindow,
else {
    // handle no main window present
}
// ... access window here

应用程序窗口阵列

let windowArray: [NSWindow] = NSApplication.shared.windows
guard windowArray.count > 0 else {
    // hand case where no windows are present
}
let window = windowArray[0]
// ... access window here