2016-07-05 1 views
4

いくつかの進捗状況を示すためにNSProgressIndicatorを使用したいと思います。しかし、私はコントロールのバーを増やす方法を見つけることができませんでした。私はウェブでも例を見つけられませんでした。Swift: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 
} 
+0

画面には何が表示されますか?それは不確定、円形、またはそれ以外の進歩を示すことができないのですか?それとも、進歩を見せていない確定的なバーですか? – Tommy

+1

@Pjotr​​Cドキュメントを読むhttps://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSProgressIndicator_Class/index.html – AK1

+0

@Tommyはい、それは表示されていない確定的なバーです任意の進捗状況(灰色のままです)。 – PjotrC

答えて

6

このようなタイトなループでは、プログレスバーを表示することはできません。

進捗インジケータの値を設定すると、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) 
      }) 
     } 
    } 
} 

:あなたはあなたのコードに次のようなものを追加することによって行うことができます。

+1

私のコードに 'progressbar.indeterminate = false'がありませんでした。私はループでファイルをダウンロードしていますので、遅延はここでは必要ありません。しかし、私は将来のあなたの使用例を覚えています。どうもありがとう。 – PjotrC