8

進行状況を表示するために 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
}
4

2 に答える 2

10

そのようなタイトなループで進行状況バーを示すことはできません。

プログレス インジケータの値を設定すると、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 秒間隔でキューに入れられます。

于 2016-07-05T22:24:28.847 に答える