2011-09-18 24 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に送信されます。

  • エクスポーズがアクティブになっていると、エクスポーズグリッドに表示されます。しかし、私はそれを選択するためにウィンドウをクリックすることはできません...それは前面に来ることはありません。

なぜ私のウィンドウは機能しませんか?

+1

アプリケーションは、「メインウィンドウ」、またはアプリケーション固有のウィンドウ、またはメインメニューを持つ必要はありません(ただし、常にメインメニュー - アプリケーションがメニューバーを使用していなくても、多くのキーコマンドが無料で提供されます)。アクティブな外観を持つウィンドウは、Cocoaの用語ではメインウィンドウです。さらに重要なのは、すべてのドキュメントベースのアプリケーション、バックグラウンド専用のアプリケーション、およびUI要素で示されるように、アプリケーションがウィンドウを持たないことは完全に有効です。 –

答えて

23

暗闇の中のスタブ:あなたのInfo.plistにLSBackgroundOnlyが設定されています。これがうまくいかない理由です。バックグラウンドでしか使えないアプリケーションがフォアグラウンドに来ることができないため、ウィンドウがフォアグラウンドにならないのです。

あなたのアプリがDockに表示されないようにするには、代わりにLSUIElementと設定します。これにより、あなたのアプリのDockタイルが抑制され、メニューバーに独自のメインメニューが表示されなくなりますが、ウィンドウを最前面に移動してキーにする機能は維持されます。

+0

うん、 'LSUIElement'はそれを修正します。私は 'NSBGOnly'を使用していましたが、現在は廃止予定です。 – cksubs

+2

@cksubs:はい:「NSBGOnly」の名前が「LSBackgroundOnly」に変更されました。古い名前のみが推奨されていません。 'LSUIElement'と' LSBackgroundOnly'は両方とも現在のものですが、異なることがあります。それらとその他の現在のキーはすべて、Information Property ListのKey Reference: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.私はInfo.plistに 'LSUIElement'を追加するだけでなく、この' activateIgnoringOtherApps'コマンドを使用する必要がありました。 – cksubs

0

これらの回答はどちらも正しいです。また、ボーダーレスの場合は、ウィンドウサブクラスでcanBecomeKeyをオーバーライドする必要があります。

これはいつまでもわかります。 (私のソリューション全体についてblog postを書きました)

関連する問題