Cocoa学习

我的Cocoa/Cocoa Touch学习笔记

在程序中动态设置是否显示Dock图标

关于如何隐藏Dock图标的方法,相信大家都知道——即使没有没有编程经验的老用户都知道。那就是,在Application Bundle里的Info.plist中增加一个LSUIElement的键,设置值为YES。但是,在程序中往往要让用户选择是否启用或禁用Dock图标。而程序是不能修改Application Bundle里的Info.plist的,因为这样会破坏程序的数字签名,所以只能在程序代码中动态的设置Dock图标的状态。

其实动态设置Dock图标的方法很简单严格的说只有两行代码:

1
2
ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);

在设置隐藏Dock图标的时候需要重启应用程序,无法在运行时动态完成的,而在显示Dock图标的时候则不需要。我做了一个简单的Demo程序。放到了Github上,有兴趣的可以看看。(以后在这里出现的其他示例代码也会放到那里。)

程序很简单,就一个复选框,用来设置是否显示Dock图标。通过一个-toggleDockIcon:方法来设置是否显示Dock图标。并且在-applicationDidFinishLaunching:方法,设置在程序初始化的时候是否需要显示Dock图标。主要代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // 读取用户设置,判断是否显示Dock图标,并且设置复选框的状态。
    defaults = [NSUserDefaults standardUserDefaults];
    BOOL iconInDock = [[NSUserDefaults standardUserDefaults] boolForKey:kShowDockIcon];

    if (iconInDock) {
        ProcessSerialNumber psn = { 0, kCurrentProcess };
        TransformProcessType(&psn, kProcessTransformToForegroundApplication);
        [self.dockIconSelector setState:NSOnState];
    }
    else {
        [self.dockIconSelector setState:NSOffState];
    }

   // 省略其他用来处理Menulet的代码。
}

- (IBAction)toggleDockIcon:(id)sender {
    NSUInteger state = [sender state];
    // 根据复选框是否选中,设置用户值,并且改变程序运行状态。
    if (state == NSOnState) {
        ProcessSerialNumber psn = { 0, kCurrentProcess };
        TransformProcessType(&psn, kProcessTransformToForegroundApplication);
        self.infoText.hidden = YES;

        [defaults setBool:YES forKey:kShowDockIcon];
        [defaults synchronize];
    }
    else {
        [defaults setBool:NO forKey:kShowDockIcon];
        self.infoText.hidden = NO;
        [defaults synchronize];
    }
}

虽然本文比较水,并且实际上只介绍了2行代码,但是这个技巧非常实用,所以推荐之。

(全文完)

Comments