莫哈韦上的NSProgressIndictor的问题



我在sierra操作系统上实现了NSProgressIndicator,它在它的应用程序中运行良好。但是,当我将应用程序移动到high-sierramojave时进行测试,progressbar根本不显示,而它可以正常工作sierra

在应用程序中单击按钮时,在按钮功能内,我启动了进度条,如下所示,

[_progressbar startAnimation:sender];
[_progressbar setHidden:false];

当我回来时,我setHidden更改为true.那么,我可能哪里出错了?

更新: 我尝试使用以下代码,

//Create the block that we wish to run on a different thread.
void (^progressBlock)(void);
progressBlock = ^{
[_progressbar setDoubleValue:0.0];
[_progressbar startAnimation:sender];
[_progressbar setHidden:false];
//  running = YES; // this is a instance variable

//NOTE: It is important to let all UI updates occur on the main thread,
//so we put the following UI updates on the main queue.
dispatch_async(dispatch_get_main_queue(), ^{
[_progressbar setNeedsDisplay:YES];
});
// Do some more hard work here...

}; //end of progressBlock
dispatch_queue_t queue = dispatch_get_global_queue(0,0);
dispatch_async(queue,progressBlock);

我在旧的macOS应用程序上注意到了这个问题,如果我没记错的话,这是在High Sierra测试版中首次测试之后,正如您刚刚发现的那样。

大多数用户界面视图需要主线程来绘制或接收用户输入。 但似乎在早期的macOS版本中,苹果已经做了一些魔术来使NSProgressIndicator显示和动画,即使主线程忙于做其他工作。 然后在最近的macOS版本(10.13?)中,这种魔力似乎已被消除。

在主线程上执行长时间运行的工作从来都不是一个好主意,因为它会在您的用户界面中产生其他视图,这些视图从未具有 NSProgressIndicator 魔力,对用户没有响应。 我认为苹果认为,既然我们现在都是多线程的Dispatch(也称为Grand Central Dispatch),是时候消除魔法了,这对他们来说可能很难维护。 我一直觉得它有点错误和不可靠。

所以答案是你需要从主线程中获取进度指示器正在跟踪的任何工作。 你可能会使用dispatch_async()和朋友,尽管NSOperation和NSOperationQueue仍然有效,并且也会完成这项工作。

相关内容

  • 没有找到相关文章

最新更新