Вывести все окна NSDocument на передний план при открытии - PullRequest
2 голосов
/ 10 июня 2011

В большинстве систем поведение «открыть новое окно» по умолчанию заключается в том, что оно отображается спереди.Этого не происходит в Какао, и я пытаюсь найти «правильный» способ сделать это стандартное поведение.Большинство вещей, которые я пробовал, работают только для максимум одного окна.

Мне нужно при запуске открыть несколько окон:

  • (N x NSDocuments (одно окно каждое)
  • 1 x простой NSWindowController, открывающий файл NIB.

Вещи, которые НЕ работают:

  1. Переберите все NSDocuments, которые я хочу открыть, и откройте их.

Что происходит? ... только «последний», который вызывает 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).

Как ни странно, иногда это работает ... даже если это именно тот код, который Apple называет внутренним.Если они называют его внутренне, почему он ведет себя иначе, если я повторно вызываю его после того, как они уже сделали это?

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

Ответы [ 3 ]

1 голос
/ 11 июня 2011

Вы можете просто открыть все документы без отображения, а затем указать документам показать их окна:

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)];
0 голосов
/ 24 ноября 2015

Часто это связано с самим приложением: другие ваши окна находятся за другими приложениями (в частности, за Xcode!) И появлялись с помощью команды «Скрыть другие».

Решение этой проблемы состояло бы в том, что после того, как вы отправите showWindow во все ваши окна (убедитесь, что вы выполняете клавишу в последнюю очередь), вы сообщаете приложению о продвижении по сравнению с другими приложениями.

NSApp.activateIgnoringOtherApps(true)  // Swift

или

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

См. Также: Как вывести NSWindow на передний план и в текущее пространство?

0 голосов
/ 09 марта 2013

Разве это не работает?

Для 10,6 или более

[[NSRunningApplication currentApplication] activateWithOptions:(NSApplicationActivateAllWindows | NSApplicationActivateIgnoringOtherApps)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...