我在NSProgressIndicator
操作系统上实现了sierra
,它在其上的应用程序中运行良好。但是,为进行测试,当我将应用程序移至high-sierra
或mojave
时, 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);
答案 0 :(得分:1)
我在旧的macOS应用程序上注意到了这个问题,如果我没记错的话,那是在您刚刚发现的High Sierra beta中进行首次测试之后。
大多数用户界面视图都需要主线程来绘制或接收用户输入。但是,似乎在早期的macOS版本中,即使主线程忙于其他工作,Apple还是做了一些魔术来使NSProgressIndicator显示和设置动画。然后在最新的macOS版本(10.13?)中,这种魔力似乎已被删除。
在主线程上进行长时间运行从来都不是一个好主意,因为它会使用户界面中的其他视图(从来没有NSProgressIndicator魔术)对用户无响应。我认为Apple认为,由于我们现在都是Dispatch(也称为 Grand Central Dispatch )的多线程用户,因此该删除魔术了,这对于他们来说可能很难保持。我总会发现它有些故障且不可靠。
所以答案是,您需要完成进度指示器正在跟踪的所有工作。尽管NSOperation和NSOperationQueue仍然可以使用,但您可能仍将使用dispatch_async()和朋友。