2011-09-17 11 views

回答

1

確定。只是以編程方式設置工作區-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

0

使用附帶的OS X,像這樣的默認命令:

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

通過發出上述命令,你設置的「com.apple.mail」標識的應用程序出現在每一個空間。 65544是一種說「每一個空間」的神奇價值。如果鍵值對(標識符+設置)存在,它將被覆蓋。

請注意,您必須重新裝載碼頭(killall Dock),並以某種方式從你的應用程序中執行這些命令。從Objective-C的範圍內,你可以使用下面的代碼片段退出碼頭:

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

從內AppleScript的使用:

quit application "Dock" 
+0

感謝您的答覆!然而,從應用運行命令行工具似乎有點冒失(沒有冒犯)。有沒有API? –

+0

您可以使用Cocoa API中的NSUserDefaults來編寫默認值:http://www.cocoadev.com/index.pl?NSUserDefaults – scravy

3

你需要在NSWindow的方法。

對於獅子使用:

- (void)setCollectionBehavior:(NSWindowCollectionBehavior)behavior 

對於預獅子覆蓋以下返回YES:

- (BOOL)canBeVisibleOnAllSpaces 
+0

這不僅僅是設置窗口允許的內容。我想你必須通過之前建議的內容具體告訴com.apple.dock。 –

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的主要應用程序窗口W上。

+0

工作得很好浮動我露臉BG的應用程序的窗口。無需混淆Dock偏好設置。 –

0

你的應用程序委託應該是這樣的......

#import "alwaysOnTopAppDelegate.h" 

@implementation alwaysOnTopAppDelegate 

@synthesize window; 

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

@end 
+0

出了什麼問題@Sjoerd可以格芬的答案嗎?它看起來更完整,也更正確,因爲它在窗口的實例化代碼中執行,而不是像你的那樣在應用程序的實例化代碼中執行(此時不是所有的窗口都可能被打開)。 –

相關問題