Swift: 如何使用NSProgressIndicator?
Swift: How to use 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
}
您将无法在如此紧凑的循环中演示进度条。
当您设置进度指示器的值时,OS X 显示机制直到下一次通过事件循环才会实际绘制差异,直到您的方法 returns。换句话说,在进度指示器甚至有机会重绘自身之前,您将其一直设置为 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 秒。
以我为例。
进展没有奏效。添加:
self.progress_bar.indeterminate = false;
解决问题。
我想使用 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
}
您将无法在如此紧凑的循环中演示进度条。
当您设置进度指示器的值时,OS X 显示机制直到下一次通过事件循环才会实际绘制差异,直到您的方法 returns。换句话说,在进度指示器甚至有机会重绘自身之前,您将其一直设置为 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 秒。
以我为例。 进展没有奏效。添加:
self.progress_bar.indeterminate = false;
解决问题。