【发布时间】:2023-03-29 14:08:01
【问题描述】:
我将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 仅在我打开菜单在连接开始之前更新,并且在下载之前不要再次关闭它完成了。但是如果我之后打开它,进度指示器不会更新。它显示了我打开菜单时属性的值,但该值不会更新。然后进度指示器也没有动画。请注意,标签确实有效...
当我更改值时,我尝试使用YES 手动调用setNeedsDisplay 并在自定义视图和进度指示器上调用display om,但这不起作用。唯一能修复进度指示器的方法是快速连续调用[progress setHidden:YES]; [progress setHidden:NO];,但这会导致进度指示器闪烁,这当然是一个糟糕的解决方案。
我做错了什么?我该如何解决这个NSProgressIndicator?
【问题讨论】:
-
嗨青蛙,我面临着类似的问题。我在 NSMenuItem 中有一个 NSProgressIndicator。当我第一次打开它但不是第二次时它是动画。您找到解决问题的方法了吗?
-
我一直无法解决这个确切的问题,但是当您将
NSProgressIndicator放在NSTableView中时,该错误不会发生。因为无论如何我都需要一个指标列表,所以这样做对我来说没有问题。我仍然不知道如何解决这个确切的问题......可能是NSMenuItem中的另一个错误...... -
感谢更新,我试试看
标签: objective-c cocoa appkit nsrunloop nsprogressindicator