nsmenuitem内のnsprogressindicatorを使用します
-
10-10-2019 - |
質問
StatusBar-Menu内でnsprogressIndicator(不定)を使用しようとしています。 Menuitemのビューとしてnsview-objectを使用しています。その後、進行状況インジケーターをサブビューして表示します。しかし、私がStartAnimationを呼びかけようとするときはいつでも:進歩のために、何も起こりません。私が通常のnswindowでまったく同じことをしようとすると、それは完全に機能します。
私はCocoaとObjective-Cの両方を初めて使用しているので、「明白な」何かを見落としていたかもしれませんが、私は回避策をかなり検索しましたが、成功しませんでした。 Menuitemsは表示されている間に更新できず、代わりにボードレスウィンドウを使用する必要があることがわかりました。しかし、私はこれをドキュメントで確認することができませんでした。
編集:
わかりました、今はほとんど機能します。 setSusthreadededanimationを使用する場合:およびMenudelegateのメニューウィロペンから新しいスレッドを作成します。このスレッドはローカルメソッドを実行します:
-(void) doWork(NSProgressIndicator*) p{
[p startAnimation:self];
}
これにより、メニューを開くときにランダム(?)ベースでProgressIndicatorが開始されます。私が電話した場合 startAnimation:
通過せずに直接 doWork:
(まだ新しいスレッドを使用しています)、それは決して機能しません。そうではありません setUsesThreadedAnimation:
Animationのためにそれが独自のスレッドを作成するProgress-Barに作成しますか?
解決
使用してそれを解決しました:
[progressIndicator performSelector:@selector(startAnimation:)
withObject:self
afterDelay:0.0
inModes:[NSArray
arrayWithObject:NSEventTrackingRunLoopMode]];
MenuWillopen:内部では、問題はStartAnimationを呼び出していたようです。
他のヒント
どのように参照していますか NSProgressIndicator
それはビューにあります(そして、その点については窓の中にありますか)?たとえば、持っているコントローラークラスはありますか IBOutlet
進捗指標に接続しましたか?あなたが使用している場合 IBOutlet
, 、nibファイルに適切に接続されていると確信していますか?
また、いつ、いつ電話していますか startAnimation:
? (いくつかのコードを見る必要があります)。
時々起こることができることの1つは、あなたがフックアップするのを忘れていることです IBOutlet
ペン先に。次に、実行時にコードで何かを実行するようにオブジェクトに指示しようとすると、 IBOutlet
は nil
, 、そして、あなたが思うのは、あなたのオブジェクトに送信されるメッセージは実際には、 nil
. 。言い換えれば、それはただ無視されており、効果的に機能していないように見えます。
UIオブジェクトへの(潜在的に)有効な参照を持っている場合、あなたが見るもう1つの一般的な問題は、開発者が時間の「早すぎる」でオブジェクトにメッセージを送信しようとしているときです。一般に、 init
メソッドは、コントローラーオブジェクトの寿命の早すぎて、ユーザーインターフェイスオブジェクトにメッセージを送信できません。 IBOutlet
まだです nil
. 。その時には -awakeFromNib
呼ばれています、 IBOutlet
sは有効である必要があります(IBに接続した場合)、UIオブジェクトにメッセージを送信できます。
-setusesthreadededanimationを介してスレッドアニメーションを使用するように言ったことがありますか:?