打开时将所有NSDocument窗口置于前面

时间:2011-06-10 13:07:02

标签: cocoa nswindow nsdocument nswindowcontroller

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

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

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

不起作用的事情:

  1. 遍历我要打开的所有NSDocuments,然后打开它们。
  2. 会发生什么? ...只有那个打开的“最后一个”来到前面 - 其余的都是隐藏的,不可见的,屏幕上没有任何地方,直到你快速切换或使用“窗口”菜单找到它们。

    代码:

    ...documents is an array of NSPersistentDocument's, loaded from CoreData...
    
    [NSDocumentController sharedDocumentController];
    [controller openDocumentWithContentsOfURL:[documents objectAtIndex:0] display:YES error:&error]; 
    
    1. 在每个窗口打开后,手动调用“makeKeyAndOrderFront”
    2. 会发生什么?没什么不同。但是我能找到获得NSWindow实例的唯一方法是如此可怕的hacky似乎完全错误(但在几个博客和邮件列表帖子中是mentioend)

      代码:

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

      ......我知道我做错了,但我无法找出原因/做什么不同:(。

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

      1. 如上所述,但只使用“showWindow”(我从NSDocument指南中获取了这个)。
      2. 奇怪的是,这有时会起作用......即使这是Apple声称他们在内部调用的确切代码。如果他们在内部调用它,为什么在我们已经这样做之后重新调用它会有不同的行为呢?

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

3 个答案:

答案 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?