2

ほとんどのシステムでは、「新しいウィンドウを開く」のデフォルトの動作は、前面に表示されることです。これは Cocoa では発生しません。私は、この標準的な動作を行うための「正しい」方法を見つけようとしています。私が試したほとんどのことは、最大1 つのウィンドウでしか機能しません。

起動時に複数のウィンドウを開く必要があります。

  • (N x NSDocuments (それぞれ 1 つのウィンドウ)
  • NIB ファイルを開くシンプルな NSWindowController x 1。

機能しないもの:

  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];
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 の背後にあります!)、Hide Others コマンドで表示されます。

その問題の解決策は、すべてのウィンドウに showWindow を送信した後 (必ず最後にキーを実行するようにしてください)、他のアプリと比較して前に来るようにアプリに指示することです。

NSApp.activateIgnoringOtherApps(true)  // Swift

また

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

参照: NSWindow を現在のスペースの前面に移動する方法は?

于 2015-11-24T18:24:08.930 に答える