Вы не сможете продемонстрировать индикатор выполнения в такой замкнутой петле.
Когда вы устанавливаете значение индикатора прогресса, механизм отображения 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 секунду.
Что появляется на экране? Является ли оно неопределенным, круговым или иным образом неспособным показывать прогресс? Или это определенный бар, который просто не показывает никакого прогресса? – Tommy
@PjotrC читает документацию https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSProgressIndicator_Class/index.html – AK1
@Tommy Да, это детерминированный бар, который не отображается любой прогресс (он остается серым). – PjotrC