我有一个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];
In the didReceiveData
委托方法然后我设置我的属性NSViewController
子类:
progressViewController.current = receivedData.length;
progressViewController.status = @"Downloading...";
progressViewController.total = expectedBytes;
如果我将属性绑定到标签,这非常有用,但是NSProgressIndicator
仅当我打开菜单时更新before连接已启动,在下载完成之前请勿再次关闭连接。但如果我之后打开它,进度指示器不会更新。它显示了我打开菜单时属性的值,但该值不会更新。进度指示器也不会显示动画。注意标签do work...
我尝试手动调用setNeedsDisplay
with YES
并打电话display
当我更改值时,自定义视图和进度指示器上都会出现 om ,但这不起作用。唯一修复进度指示器的方法是调用[progress setHidden:YES]; [progress setHidden:NO];
快速连续,但这会导致进度指示器闪烁,这当然是一个糟糕的解决方案。
我究竟做错了什么?我怎样才能解决这个问题NSProgressIndicator
?