在大多数系统中,“打开新窗口”的默认行为是它出现在前面。这在Cocoa中不会发生,我正试图找到制定这种标准行为的“正确”方法。我尝试过的大多数事情只适用于一个窗口的最大。
我需要在启动时打开多个窗口:
不起作用的事情:
会发生什么? ...只有那个打开的“最后一个”来到前面 - 其余的都是隐藏的,不可见的,屏幕上没有任何地方,直到你快速切换或使用“窗口”菜单找到它们。
代码:
...documents is an array of NSPersistentDocument's, loaded from CoreData...
[NSDocumentController sharedDocumentController];
[controller openDocumentWithContentsOfURL:[documents objectAtIndex:0] display:YES error:&error];
会发生什么?没什么不同。但是我能找到获得NSWindow实例的唯一方法是如此可怕的hacky似乎完全错误(但在几个博客和邮件列表帖子中是mentioend)
代码:
[NSDocumentController sharedDocumentController];
NSDocument* openedDocument = [controller openDocumentWithContentsOfURL:[documents objectAtIndex:0] display:YES error:&error];
[[[[openedDocument windowControllers] objectAtIndex:0] window] makeKeyAndOrderFront:nil];
......我知道我做错了,但我无法找出原因/做什么不同:(。
通常有效的东西,但并非总是如此:
奇怪的是,这有时会起作用......即使这是Apple声称他们在内部调用的确切代码。如果他们在内部调用它,为什么在我们已经这样做之后重新调用它会有不同的行为呢?
[[[openedDocument windowControllers] objectAtIndex:0] showWindow:self];
答案 0 :(得分: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)];
答案 1 :(得分:0)
这不会起作用吗?
10.6或更高
[[NSRunningApplication currentApplication] activateWithOptions:(NSApplicationActivateAllWindows | NSApplicationActivateIgnoringOtherApps)];
答案 2 :(得分:0)
这通常与应用程序本身有关:您的其他窗口位于其他应用程序之后(特别是在Xcode之后!),并且会出现“隐藏其他”命令。
该问题的解决方案是,在您将showWindow发送到所有窗口后(确保最后一次使用密钥),您可以告诉应用程序相对于其他应用程序挺身而出。
NSApp.activateIgnoringOtherApps(true) // Swift
或
[NSApp activateIgnoringOtherApps:YES]; // Objective-C
另请参阅:How to bring NSWindow to front and to the current Space?