Cocoa - 以编程方式将应用程序添加到所有空间

时间:2011-09-17 22:48:49

标签: cocoa nswindow spaces

有没有办法以编程方式将应用程序添加到所有空间?我希望我的应用程序默认位于所有空间。

5 个答案:

答案 0 :(得分:3)

您需要的方法是在NSWindow。

狮子使用:

- (void)setCollectionBehavior:(NSWindowCollectionBehavior)behavior

对于pre-Lion,重写以下内容以返回YES:

- (BOOL)canBeVisibleOnAllSpaces

答案 1 :(得分:2)

这段代码适合我(至少在我最近工作的一个小项目中的10.6.8):

-(void)windowDidLoad {
    // Make the window visible on all Spaces
    if([[self window] respondsToSelector: @selector(setCollectionBehavior:)]) {
        [[self window] setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces];
    }
    else if([[self window] respondsToSelector: @selector(canBeVisibleOnAllSpaces)]) {
        [[self window] canBeVisibleOnAllSpaces]; // AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED
    }
}

我将此代码放在主窗口的WindowController的(自定义子类)中。

答案 2 :(得分:1)

确定。只是以编程方式设置workspaces-app-bindings不起作用。我试过了:

1) Verified no entries were in System Preferences->Spaces

2) defaults write com.apple.dock workspaces-app-bindings -dict-add com.apple.mail 65544

3) killall Dock (also needed to kill System Preferences )

4) Opened System Preferences->Spaces to verify the Mail app entry 
   appeared and was set to Every Space

5) Launched Mail, but it was still stuck to Space 1

6) Only when I went back into System Preferences->Spaces and changed the 
   Mail app *from* Every Space and then *back* to Every Space did the Mail 
   app stick to every space

很明显,系统首选项正在做一些额外的事情来激活设置。有谁知道这可能是什么?谢谢!

更新:所以我能够通过使用applescript api而不是用户默认api来实现这一点。以下文章讲述了如何使用applescript附加条目。然后就是杀了码头。

Applescript; opening an app in Space number N

答案 3 :(得分:0)

使用OS X附带的defaults-command,如下所示:

defaults write com.apple.dock workspaces-app-bindings -dict-add com.apple.mail 65544

通过发出上述命令,您可以将“com.apple.mail”标识的应用程序设置为显示在每个空格中。 65544是一个神奇的价值,说“每个空间”。如果键值对(标识符+设置)存在,它将被覆盖。

请注意,您必须重新加载Dock(killall Dock)并以某种方式从应用程序中执行这些命令。在objective-c中,您可以使用以下代码段退出Dock:

NSRunningApplication *dock = [NSRunningApplicationrunningApplicationWithBundleIdentifier:@"com.apple.dock"];
[dock terminate];

在AppleScript中使用以下内容:

quit application "Dock"

答案 4 :(得分:0)

您的应用代表应该看起来像这样......

#import "alwaysOnTopAppDelegate.h"

@implementation alwaysOnTopAppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [window setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces];
}

@end