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

这有点奇怪,并且与标题中的注释背道而驰,但请尝试使用它:

- (BOOL)openFile:(NSString *)fullPath withApplication:(NSString *)appName andDeactivate:(BOOL)flag;

从那里的评论:

在某个路径打开文件。如果您使用没有 withApplication: 参数的变体,或者如果您为此参数传递 nil,则使用默认应用程序。appName 参数可以是应用程序的完整路径,或者只是应用程序的名称,带或不带 .app 扩展名。如果你为 andDeactivate: 传递 YES,或者在没有这个参数的情况下调用一个变体,调用的应用程序在新应用程序启动之前被停用,这样新应用程序可能会出现在前台,除非用户在此期间切换到另一个应用程序。通常建议为 andDeactivate: 传递 YES。

所以听起来你的应用程序应该被停用(因为你正在调用一个没有andDeactivate:参数的变体)但我会尝试明确地使用带有该参数的变体,以确保。

于 2013-06-12T17:47:00.220 回答
0

根据经验,如果启动的应用程序呈现模态 UI,则启动的应用程序似乎不会激活,至少在使用NSWorkspaceAPI 时不会。我能够使用 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 并直接发送它们来摆脱脚本编译阶段(即更快),但这似乎达到了预期的效果,即使在启动时呈现模态 UI应用。

于 2013-06-12T22:48:54.157 回答