7

だから私は自分の基地をカバーしたと思ったが、どうやら私は重要なステップを1つか2つ逃しているようだ。

makeKeyAndOrderFront:NSStatusItemが押されたときに表示される()NSPanelがあります。物事はうまく機能しますが、NSPanelがタイトルバーを表示するので、パネルもドラッグ可能です。(これは望ましくありません。)

最初のスクリーンショットは、InterfaceBuilderの[外観]カテゴリで[タイトルバー]が有効になっているパネルを示しています。(ぼやけて申し訳ありませんが、物事は今のところまだロックとキーの下にあります。)

最初のスクリーンショット

Interface Builderで行われる唯一の変更は、[タイトルバー]チェックボックスをオフにすることです。次に、保存して再実行します。これが2番目のスクリーンショットに表示されています。わずかな影が表示されますが、パネルには表示されません。

ここに画像の説明を入力してください

私が試したこと:

  • NSPanelをサブクラス化して、少し調査した後、戻ってきましたがYES、(サブクラス化する前に)これらのメソッドは、タイトルバーを使用しているかどうかに関係なく両方とも戻ってきました。ですから、これは問題ではないと思います。canBecomeKeyWindowcanBecomeMainWindowNO

  • NSPanelのフレームが正しく設定されていることを確認しました。高さが良く、原点もきちんと設定されています。

編集:言及するのを忘れた:

このアプリケーションは、メニューバーのみのアプリケーションです。Info.plist以下のスクリーンショットでは、これを強制するために追加のエントリが追加されていることに注意してください。

情報リスト

4

2 に答える 2

4

私は過去にこれに問題がありました。最初に他のアプリを「無視」し、次にそれをキーウィンドウにすることで解決できました。それを試してみて、それがあなたのために働くかどうか見てください。

[NSApp activateIgnoringOtherApps:YES];
[[self window]makeKeyAndOrderFront:self];

NSPopUpMenuWindowLevelまた、初期化中に ウィンドウレベルをに設定してみてください。

[[self window]setLevel:NSPopUpMenuWindowLevel];

また、Mac OS Xでのnibファイルのロード方法にも問題がありました。これらは「遅延」でロードされます。つまり、必要になるまで初期化されません。これは、ウィンドウに詳細を設定したいときに問題を引き起こしますが、awakeFromNibペン先の読み込みが遅いために呼び出されていないように見えるため、設定できません。これを修正するために、これが私が過去に行ったことです。デリゲート(またはウィンドウを初期化する場所)でwindow、初期化されたクラスのプロパティにアクセスして、ウィンドウを実行に移します。

wc = [[blah alloc]initWithWindowNibName:NSStringFromClass([blah class])];
(void)[wc window]; //just kicks the lazy nib loading into gear

そうすることで、ペン先を強制的に初期化することになります。このように、ユーザーがメニューバーアイコンをクリックすると、ペン先はすでに初期化されており、awakeFromNibすでに呼び出されています。

于 2011-10-08T19:49:04.877 に答える
1

わずかな影が表示されますが、パネルには表示されません。

makeKeyAndOrderFront:このNSPanelオブジェクトでは、アプリの実行時に表示されませんか?サンプルプロジェクトを作成したところ、NSButtonが同じタイプのNSPanelをトリガーして表示し、正常に動作します。titleBarが有効かどうか。

http://cl.ly/3d0U3C0P3u2D0m3T1w1N

于 2011-10-08T16:37:09.387 に答える