2

在大多数系统中,“打开一个新窗口”的默认行为是它出现在前面。这在 Cocoa 中不会发生,我正在尝试找到“正确”的方法来实现这种标准行为。我尝试过的大多数事情最多只能用于一个窗口。

我需要在启动时打开多个窗口:

  • (N x NSDocuments(每个窗口一个)
  • 1 x 简单的 NSWindowController 打开一个 NIB 文件。

不起作用的事情:

  1. 遍历我要打开的所有 NSDocument,然后打开它们。

怎么了?...只有调用 open 的“最后一个”出现在前面 - 其余的都是隐藏的,不可见的,在屏幕上无处可见,直到您快速切换或使用“窗口”菜单找到它们。

代码:

...documents is an array of NSPersistentDocument's, loaded from CoreData...

[NSDocumentController sharedDocumentController];
[controller openDocumentWithContentsOfURL:[documents objectAtIndex:0] display:YES error:&error]; 
  1. 在每个窗口打开后手动调用“makeKeyAndOrderFront”

怎么了?没什么不同。但是我能找到获取 NSWindow 实例的唯一方法是如此可怕,它似乎完全错误(但在几个博客和邮件列表帖子中都提到了)

代码:

[NSDocumentController sharedDocumentController];
NSDocument* openedDocument = [controller openDocumentWithContentsOfURL:[documents objectAtIndex:0] display:YES error:&error]; 
[[[[openedDocument windowControllers] objectAtIndex:0] window] makeKeyAndOrderFront:nil];

...我知道我做错了,但我不知道为什么/做什么不同:(。

通常但并非总是有效的东西:

  1. 如上所述,但只使用“showWindow”代替(我从 NSDocument 指南中获取)。

奇怪的是,这有时会奏效......即使这是苹果声称他们在内部调用的确切代码。如果他们在内部调用它,如果我在他们已经这样做之后重新调用它,为什么它的行为会有所不同?

[[[openedDocument windowControllers] objectAtIndex:0] showWindow:self];
4

3 回答 3

1

您可以只打开所有文档而不显示,然后告诉文档显示它们的窗口:

NSArray* docs = [NSArray arrayWithObjects:@"doc1.rtf", @"doc2.rtf",@"doc3.rtf",@"doc4.rtf",nil];

for(NSString* doc in docs)
{
    NSURL* url = [NSURL fileURLWithPath:[[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:doc]];
    NSError* err;
    [[NSDocumentController sharedDocumentController] openDocumentWithContentsOfURL:url display:NO error:&err];
}

[[[NSDocumentController sharedDocumentController] documents] makeObjectsPerformSelector:@selector(showWindows)];
于 2011-06-10T23:52:49.207 回答
1

这行不通吗?

对于 10.6 或更高版本

[[NSRunningApplication currentApplication] activateWithOptions:(NSApplicationActivateAllWindows | NSApplicationActivateIgnoringOtherApps)];
于 2013-03-09T05:33:09.047 回答
0

这通常与应用程序本身有关:您的其他窗口在其他应用程序之后(特别是在 Xcode 之后!),并且会出现隐藏其他命令。

解决该问题的方法是,在将 showWindow 发送到所有窗口(确保最后一个键)之后,您告诉应用程序相对于其他应用程序挺身而出。

NSApp.activateIgnoringOtherApps(true)  // Swift

或者

[NSApp activateIgnoringOtherApps:YES];  // Objective-C

另请参阅:如何将 NSWindow 带到前面和当前空间?

于 2015-11-24T18:24:08.930 回答