3

(メニュー バー アプリケーション)に がNSMenu添付されています。NSStatusItemファイルのダウンロード中に、このメニューの項目に NSProgressIndicator を表示したいと考えています。NSViewController次のプロパティを使用して、この進行状況インジケーターのサブクラスを作成しました。

@property NSUInteger current; // Bound to NSProgressIndicator value
@property NSString *status;   // Bound to a NSTextField value
@property NSUInteger total;   // Bound to NSProgressIndicator max value

必要に応じて、次のコードを使用してファイルのダウンロードを開始します。このコードは で実行されNSRunLoopCommonModes、 が表示されたときにデリゲート メソッドも呼び出されるようにしNSMenuます (これは で実行されますNSEventTrackingRunLoopMode)。

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[connection start];

didReceiveDataデリゲート メソッドで、サブクラスのプロパティを設定しますNSViewController

progressViewController.current = receivedData.length;
progressViewController.status = @"Downloading...";
progressViewController.total = expectedBytes;

これは、プロパティをラベルにバインドするとうまく機能しますが、接続が開始される前NSProgressIndicatorにメニューを開いた場合にのみ更新され、ダウンロードが完了するまで再度閉じないでください。しかし、後で開くと、進行状況インジケーターが更新されません。メニューを開いた時点でのプロパティの値が表示されますが、この値は更新されません。進行状況インジケーターもアニメーション化されません。ラベルは機能することに注意してください...

setNeedsDisplay値を変更するときに、カスタム ビューと進行状況インジケーターの両方で手動でwithYESとom を呼び出そうとしましdisplayたが、うまくいきません。[progress setHidden:YES]; [progress setHidden:NO];進行状況インジケーターを修正する唯一の方法は、立て続けに呼び出すことですが、これは進行状況インジケーターがちらつきます。もちろん、これは悪い解決策です。

私は何を間違っていますか?どうすればこれを修正できますNSProgressIndicatorか?

4

1 に答える 1

0

私は同じ問題を抱えていましたが、この回答で問題が解決しました: https://stackoverflow.com/a/4692194/406677

迅速に:

progressIndicator.performSelector("startAnimation:", withObject:self, afterDelay: 0.0, inModes: [NSEventTrackingRunLoopMode])
于 2015-12-08T09:52:25.473 に答える