2011-09-18 55 views
16

makeKeyAndOrderFront不使我NSWindow鍵或前面。NSWindow makeKeyAndOrderFront使窗口出現,但不是密鑰或正面

我的應用程序沒有主窗口或菜單欄,這可能是問題的一部分?

IBOutlet NSWindow *loginWindow; 
//(connected in Interface Builder to the NSWindow) 

NSWindow在「啓動時可見」和「關閉時釋放」均未選中。

然後:

- (void) applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    [loginWindow makeKeyAndOrderFront:self]; 
} 

確實打開窗口。 (在沒有窗口打開的情況下評論結果)。

然而:

  • 似乎Xcode的窗口(未前)的後面。

  • 它似乎接收鼠標焦點,但不會在窗口包含的文本字段中使用按鍵。按鍵被髮送到Xcode。

  • 當Expose激活時它出現在Expose網格中。但是我不能點擊窗口在Expose中選擇它......它不會出現在前面。

爲什麼我的窗口不工作?

+1

應用程序不需要有一個「主窗口」,或者實際上任何應用程序特定的窗口,也不需要主菜單(儘管他們總是應該有一個主菜單 - 即使應用程序不使用菜單欄,也可以免費獲得許多鍵盤命令)。活動外觀的任何窗口都是可可術語的主窗口;更重要的是,它對於沒有窗口的應用程序是完全有效的,如每個基於文檔的應用程序,僅背景應用程序和UI元素所展示的。 –

回答

23

在黑暗中刺傷:您的LSBackgroundOnly設置在您的Info.plist中。這就是使這不起作用的原因:只有後臺的應用程序不能到達前臺,這就是爲什麼你的窗口不能到達前臺。

如果您希望自己的應用不在Dock中顯示,請改爲設置LSUIElement。這會抑制應用程序的Dock貼圖,並阻止它在菜單欄中顯示其自己的主菜單,但保留了將窗口放在最前面並使其成爲關鍵的功能。

+0

是的,'LSUIElement'修復它。我正在使用'NSBGOnly',現在已經被棄用了。 – cksubs

+2

@cksubs:是:「NSBGOnly」被重命名爲「LSBackgroundOnly」。只有舊名稱已棄用; 'LSUIElement'和'LSBackgroundOnly'都是最新的,但做不同的事情。他們以及所有其他當前密鑰都記錄在「信息屬性列表重要參考」中:http://developer.apple.com/library/mac/documentation/General/Reference/InfoPlistKeyReference/ –

29

嘗試調用此方法[NSApp activateIgnoringOtherApps:YES];。這應該使其成爲活躍的應用程序。

+0

正如你寫的那樣?或者我必須用'NSApp'替代一個變量?在'makeKeyAndOrderFront'行之上按原樣粘貼,沒有任何變化。與我上面描述的完全相同的行爲。 – cksubs

+0

@cksubs:'NSApp'是一個變量;你不需要改變它。這應該解決您的直接問題(應用程序不是最前面的),但不應該是必需的(應用程序應該自動作爲Xcode啓動的一部分自動放在最前面)。 –

+2

P.S.我實際上最終需要使用'activateIgnoringOtherApps'命令,除了向Info.plist添加'LSUIElement'外。 – cksubs

0

這兩個答案都是正確的。如果無邊界,您還需要確保在窗口子類中覆蓋canBecomeKey

這花了很長時間才弄清楚。 (我寫了一個blog post關於我的整個解決方案。)