Swift:如何使用NSProgressIndicator?

时间:2016-07-05 21:16:46

标签: swift nsprogressindicator

我想使用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
}

2 个答案:

答案 0 :(得分:6)

你无法在如此紧凑的循环中展示进度条。

当您设置进度指示器的值时,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秒间隔。

答案 1 :(得分:0)

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

self.progress_bar.indeterminate = false;

解决问题。