そのようなタイトなループで進行状況バーを示すことはできません。
プログレス インジケータの値を設定すると、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 秒間隔でキューに入れられます。