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])