このようなタイトなループでは、プログレスバーを表示することはできません。
進捗インジケータの値を設定すると、OS X表示メカニズムは、次回のイベントループまで差分を描画しません。これは、メソッドが復帰するまで発生しません。言い換えれば、進行状況インジケータが自分自身を再描画する機会を得る前に、すべてを10に設定しているので、最終的に満たされた状態になります。
理論的には、ループ()を通過するたびに進行状況インジケータを表示することができますが、0.01秒以内に発生したときの違いを区別することはできません。
解決策は、incrementBy(1)
の呼び出しの間に小さな遅延を導入して、次のイベントループが発生し、新しい値の表示が行われるようにすることです。これは、1秒間隔であることを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)
})
}
}
}
:あなたはあなたのコードに次のようなものを追加することによって行うことができます。
画面には何が表示されますか?それは不確定、円形、またはそれ以外の進歩を示すことができないのですか?それとも、進歩を見せていない確定的なバーですか? – Tommy
@PjotrCドキュメントを読むhttps://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSProgressIndicator_Class/index.html – AK1
@Tommyはい、それは表示されていない確定的なバーです任意の進捗状況(灰色のままです)。 – PjotrC