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打开菜单,并且在下载完成之前不要再次关闭它,则唯一的更新。但是如果我之后打开它,进度指示器不会更新。它显示了我打开菜单时属性的值,但该值不会更新。然后进度指示器也没有动画。请注意,标签确实有效...

当我更改值时,我尝试在自定义视图和进度指示器上手动调用setNeedsDisplayYES调用displayom,但这不起作用。修复进度指示器的唯一方法是[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 回答