2011-01-12 21 views
6

ステータスバーメニュー内でNSProgressIndicator(不確定)を使用しようとしています。私はmenuitemのビューとしてNSViewオブジェクトを使用しています。そして、それを表示するために進捗インジケータをサブビューします。しかし、私がstartAnimationを呼び出そうとすると、進捗状況は何も起こりません。私は通常のNSWindowで全く同じことをしようとすると、それは完全に動作します。NSMenuItem内でのNSProgressIndicatorの使用

私は「明らかに」何かを見落としてきたかもしれないが、私はこの問題を回避するために、成功せずかなり検索したので、私はココアとObjective-Cの両方に新たなんです。表示されている間にmenuitems cantが更新されることがあり、代わりに無枠のウィンドウを使用する必要があることがわかりました。しかし、私はどのドキュメントでもこれを確認することができませんでした。

編集:

setUsesThreadedAnimation:を使用し、MenuDelegateのmenuWillOpenから新しいスレッドを作成します。このスレッドは、ローカルメソッドを実行します。

-(void) doWork(NSProgressIndicator*) p{ 
    [p startAnimation:self]; 
} 

これは、メニューを開くときにプログレスインジケータをランダム(?)に開始します。 doWork:(まだ新しいスレッドを使用しています)を経由せずにstartAnimation:を直接呼び出すと、決してうまく動作しません。 setUsesThreadedAnimation:アニメーション用のスレッドをプログレスバーで作成しないでください。

答えて

16

を使用して、それを解決:プログレスバー自体を描く終えた前:

[progressIndicator performSelector:@selector(startAnimation:) 
          withObject:self 
          afterDelay:0.0 
           inModes:[NSArray 
         arrayWithObject:NSEventTrackingRunLoopMode]]; 

をmenuWillOpen内部:,問題がstartAnimationを呼び出すされているようです。

+0

そんなアドバイスをいただきありがとうございます。本当に助かります! – Yojik

+0

私はこの作品を作るために何度も探してきました、ありがとうございました! – Jasper

+0

ありがとうございました!ありがとうございました!ありがとうございました! –

0

あなたは-setUsesThreadedAnimationを経由して、ねじアニメーションを使用するように言いました:?

+0

はい、役に立たないようです。 – Henrik

1

はどのようにして(そのことについて、およびウィンドウ内の1つの)ビューにあるNSProgressIndicatorを参照していますか?たとえば、IBOutletが進捗インジケータに接続されているコントローラクラスを持っていますか? IBOutletを使用している場合は、nibファイルに正しく接続されていることを確認してください。

また、どこでいつstartAnimation:に電話しますか? (私たちはいくつかのコードを見る必要があります)。時々発生する可能性が

ことの一つは、あなたがペン先にIBOutletをフックアップすることを忘れていることです。実行時にコード内で何かを行うようオブジェクトに指示しようとすると、IBOutletnilとなるため、オブジェクトに送信されるメッセージは実際にはnilに送信されます。言い換えれば、それはちょうど無視され、効果的ではないように見えます。

UIオブジェクトへの(潜在的な)有効な参照がある場合は、開発者が「あまりにも早い」時間にオブジェクトにメッセージを送信しようとしているときに表示されるその他の一般的な問題があります。一般に、initメソッドは、コントローラオブジェクトの有効期間が長すぎてユーザーインターフェイスオブジェクトにメッセージを送信できません。IBOutletはまだnilです。 -awakeFromNibが呼び出されるまでには、IBOutletが有効である必要があります(IBでそれらを接続している場合)ので、メッセージをUIオブジェクトに送信できます。

+0

良い点は、コンセントコンポーネントに手を差し伸べようとしたときに(なぜなら、あまりにも早すぎると)、時々nil値を持っていた理由を説明するものです。今私はそれを絞り込みの問題に絞り込んだようです。私は、ビューを含むmenuitemが(私のビューのdrawRect :)でハイライト表示されているときにアニメートさせ、それが強調表示されなくなったら停止させます。しかし、アイテムが強調表示されているかどうかをチェックするif節の外側でアニメーション化しようとすると、何も起こりません(drawRectの中にまだあります:)。 – Henrik

+0

私はそれをいくらか稼働させることができました。私はstartAnimationを送信しなければならなかったようです。しかし、メニューが表示されているときにアニメーション化する(またはしない)ようにします。現在のところ、私はそれがメニューが表示されているときに、それが非表示にする必要があります(setDisplayWhenStopped:NO)でもアニメーション化していないプログレスバーを表示するとき、それを開始するためにビューの上にマウスオーバーする必要があります。次のコメントで続ける... – Henrik

+0

そして、私はビューオブジェクトの外からそれを呼び出すときに、それを動作させることができません。コントローラクラスのNSMenuのサブビューをナビゲートします。アニメーションが機能するようにメニューが表示されているときは、何らかのイベントが必要であるようです。 – Henrik

関連する問題