斯威夫特:如何使用 NSProgressIndicator?

Posted

技术标签:

【中文标题】斯威夫特:如何使用 NSProgressIndicator?【英文标题】:Swift: How to use NSProgressIndicator? 【发布时间】:2016-07-05 21:16:46 【问题描述】:

我想使用 NSProgressIndicator 来显示一些进度。但我找不到增加该控制栏的方法。我也没有在网上找到一个例子。

let progressbar = NSProgressIndicator()
progressbar.frame = NSRect(x: 100, y: 20, width: 150, height: 10)
progressbar.minValue = 0
progressbar.maxValue = 10
self.window.contentView?.addSubview(progressbar)

for i in 0...10 
    progressbar.incrementBy(1)  //has no effect

【问题讨论】:

屏幕上出现了什么?它是不确定的、循环的还是无法显示进度的?或者它是一个没有显示任何进展的确定栏? @Pjotr​​C 阅读文档developer.apple.com/library/mac/documentation/Cocoa/Reference/… @Tommy 是的,它是一个没有显示任何进度的确定栏(它保持灰色)。 【参考方案1】:

您将无法在如此紧密的循环中展示进度条。

当您设置进度指示器的值时,OS X 显示机制实际上不会在下一次通过事件循环之前绘制差异,直到您的方法返回后才会发生。换句话说,在进度指示器有机会重绘自己之前,您将其一直设置为 10,因此您看到的只是最终填充状态。

理论上,您可以强制在每次循环后显示进度指示器 (progressbar.display()),但我认为当它们发生在 0.01 秒内时,您无法区分它们。

然后,解决方案是在调用incrementBy(1) 之间引入一个小的延迟,以便可以发生下一个事件循环并显示新值。您可以通过在代码中添加以下内容来做到这一点:

func delay(delay:Double, closure:()->()) 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
        Int64(delay * Double(NSEC_PER_SEC))),
                   dispatch_get_main_queue(), closure)


class AppDelegate: NSObject, NSApplicationDelegate 
    @IBOutlet weak var progressIndicator: NSProgressIndicator!

    func applicationDidFinishLaunching(aNotification: NSNotification) 
        let progressbar = NSProgressIndicator()
        progressbar.frame = NSRect(x:100, y:20, width:150, height:10)
        progressbar.minValue = 0
        progressbar.maxValue = 10
        self.window.contentView?.addSubview(progressbar)

        self.progressIndicator = progressbar
        progressIndicator.indeterminate = false

        for i in 0...10 
            delay(1.0 * Double(i), closure:  
                self.progressIndicator.incrementBy(1)
            )
        
    

这会将incrementBy(1) 的调用排队,以 1 秒为间隔。

【讨论】:

progressbar.indeterminate = false 在我的代码中丢失...我正在循环中下载文件,所以这里不需要延迟。但我会记住你的例子,以备将来使用。非常感谢。 以编程方式初始化和设置 NSProgressIndicator 属性不起作用。有人遇到过这个问题吗?【参考方案2】:

就我而言。 进展没有奏效。添加:

self.progress_bar.indeterminate = false;

解决问题。

【讨论】:

以上是关于斯威夫特:如何使用 NSProgressIndicator?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 POST 请求登录网站? (斯威夫特,iOS)

如何使用 segue 从 Xib 文件加载 viewController?斯威夫特 5

如何将 JSON 令牌保存到用户默认值,然后在不同的视图中使用它?斯威夫特 4

斯威夫特:如何延长短音的播放时间

斯威夫特:无法弄清楚如何保存用户离开表格视图的方式

如何将 Item 插入 collectionView ?斯威夫特3