0

環境設定ウィンドウを備えた Mac アプリがあります。設定ウィンドウがモーダルで開かれます

-(IBAction)displayPreferencesWindow:(id)sender{
    if (!pc) {
        pc = [[PreferencesController alloc] initWithWindowNibName:@"PreferencesController"];
        pc.delegate = self;
    }
    NSWindow *pcWindow = [pc window];

    [NSApp runModalForWindow: pcWindow];

    [NSApp endSheet: pcWindow];

    [pcWindow orderOut: self];
}

設定ウィンドウには、アカウント設定パネルを開くボタンがあります

- (IBAction)openSystemPrefs:(id)sender {
    [[NSWorkspace sharedWorkspace] openFile:@"/System/Library/PreferencePanes/Accounts.prefPane"];
}

問題は、アカウント設定パネルが実際のウィンドウの前に開かないことです。どうすればこれを達成できますか?

ここに画像の説明を入力

4

2 に答える 2

0

NSWorkspace経験的に、起動アプリケーションがモーダル UI を提示している場合、少なくともAPIを使用している場合は、起動アプリケーションはアクティブにならないようです。AppleScript を使用して、目的の結果が得られるように見える何かをハックすることができました。

- (IBAction)doStuff:(id)sender
{
    [[NSWorkspace sharedWorkspace] openFile:@"/System/Library/PreferencePanes/Accounts.prefPane"];

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSString* s = @"tell application \"System Preferences\" to activate";
        NSAppleScript* as = [[[NSAppleScript alloc] initWithSource: s] autorelease];
        NSDictionary* error = nil;
        if ([as compileAndReturnError: &error])
        {
            (void)[as executeAndReturnError: &error];
        }
    });
}

AppleScript のコンパイルと実行に数百ミリ秒かかるため、バックグラウンド キューにディスパッチしました。同期的に実行すると少し目立ちます (ボタンが予想よりも長く強調表示されたままになります)。

本当に自虐的だと感じている場合は、同等の AppleEvents を呼び出して直接送信することで、おそらくスクリプトのコンパイル フェーズから抜け出すことができます (つまり、より迅速に)。応用。

于 2013-06-12T22:48:54.157 に答える