NSProgressIndicator в NSMenuItem не обновляется на втором дисплее

У меня есть 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 с YES и позвонить display ом как на пользовательском представлении, так и на индикаторе прогресса, когда я изменяю значения, но это не работает. Единственное, что исправляет индикатор прогресса - это [progress setHidden:YES]; [progress setHidden:NO]; в быстрой последовательности, но это вызывает мерцание индикатора прогресса и, конечно, является плохим решением.

Что я делаю неправильно? Как я могу это исправить NSProgressIndicator?

1 ответ

У меня была та же проблема, и этот ответ решил мою проблему: /questions/17831308/ispolzovanie-nsprogressindicator-vnutri-nsmenuitem/17831326#17831326

В скором времени:

progressIndicator.performSelector("startAnimation:", withObject:self, afterDelay: 0.0, inModes: [NSEventTrackingRunLoopMode])
Другие вопросы по тегам