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 未在第二次显示时更新的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义视图的 NSMenuItem 不接收鼠标事件

禁用 NSMenuItem

MacOS:在NSMenuItem快捷键入或鼠标按下之间进行标识

似乎无法在 NSMenuItem 上设置启用:否

在显示主机菜单时更新 NSMenuItem

如何在 NSMenuItem 的操作上设置发件人?