7

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

私はココアとobjective-cの両方に慣れていないので、「明らかな」ものを見落としている可能性がありますが、回避策をかなり探しましたが、成功しませんでした。メニュー項目が表示されている間は更新できず、代わりにボーダーレス ウィンドウを使用する必要があることがわかりました。しかし、私はこれをどのドキュメントでも確認できませんでした。

編集:

わかりました、ほとんど動作します。setUsesThreadedAnimation: を使用し、MenuDelegate の menuWillOpen から新しいスレッドを作成する場合。このスレッドは、ローカル メソッドを実行します。

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

これにより、メニューを開くときに進行状況インジケーターがランダム (?) ベースで開始されます。startAnimation:通過せずにdoWork:(まだ新しいスレッドを使用して)直接呼び出すと、機能しません。setUsesThreadedAnimation:プログレスバーにアニメーション用の独自のスレッドを作成させませんか?

4

3 に答える 3

16

以下を使用して解決しました:

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

menuWillOpen: 内では、プログレスバーの描画が完了する前に startAnimation: を呼び出していたことが問題のようです。

于 2011-01-14T14:40:56.630 に答える
1

NSProgressIndicatorビューにあるもの (さらに言えば、ウィンドウにあるもの) をどのように参照していますか? たとえばIBOutlet、進行状況インジケーターに接続されているコントローラー クラスはありますか? を使用している場合IBOutlet、nib ファイルに適切に接続されていますか?

また、いつ、どこに電話していますstartAnimation:か?(いくつかのコードを確認する必要があります)。

IBOutletペン先にを接続するのを忘れてしまうことがあります。次に、実行時にコードで何かを実行するようにオブジェクトに指示しようとすると、IBOutletnilであり、オブジェクトに送信されるメッセージと思われるものは、実際には に送信されるメッセージnilです。言い換えれば、それは単に無視され、実際には機能していないように見えます。

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

于 2011-01-12T21:26:31.523 に答える
0

-setUsesThreadedAnimation: でスレッド化されたアニメーションを使用するように指示しましたか?

于 2011-01-12T20:35:34.643 に答える