NSMenuItem 中的 NSProgressIndicator 未在第二次显示时更新
Posted
技术标签:
【中文标题】NSMenuItem 中的 NSProgressIndicator 未在第二次显示时更新【英文标题】:NSProgressIndicator in NSMenuItem not updating on second display 【发布时间】:2014-05-23 16:11:14 【问题描述】:我将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
中的另一个错误......
感谢更新,我试试看
【参考方案1】:
我遇到了同样的问题,这个答案解决了我的问题: https://***.com/a/4692194/406677
迅速:
progressIndicator.performSelector("startAnimation:", withObject:self, afterDelay: 0.0, inModes: [NSEventTrackingRunLoopMode])
【讨论】:
以上是关于NSMenuItem 中的 NSProgressIndicator 未在第二次显示时更新的主要内容,如果未能解决你的问题,请参考以下文章