我正在尝试从其他类中更改我的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];
(它发出警告)
答案 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