0

NSPopupButton のメニュー項目でスピナーをアニメーション化する方法を見つけようとしています。スピナーをアニメーション化できません。表示されますが、何もしません。

これまでのところ、次のようにスピナーをメニュー項目に追加しました。

_spinner = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(0,0,16,16)];
[_spinner setIndeterminate:YES];
[_spinner setStyle:NSProgressIndicatorSpinningStyle];
[_spinner setControlSize:NSSmallControlSize];
[_spinner setDisplayedWhenStopped:YES];
[_spinner setHidden:NO];

NSMenuItem *item = [[button menu] itemWithTag:0];
[item setView:_spinner];

NSPopUpButtonWillPopUpNotification をリッスンしています。通知を受け取ったらこれを行いますが、スピナーが表示されてアニメーション化しません:

[_spinner setUsesThreadedAnimation:YES];
[_spinner startAnimation:nil];

これを編集して問題を更新しました

4

1 に答える 1

1

この方法を試してください:

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

于 2012-11-10T02:25:56.810 に答える