我有一个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
om,但这不起作用。修复进度指示器的唯一方法是[progress setHidden:YES]; [progress setHidden:NO];
快速连续调用,但这会导致进度指示器闪烁,这当然是一个糟糕的解决方案。
我究竟做错了什么?我该如何解决这个问题NSProgressIndicator
?