2016-07-05 7 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

@PjotrC читает документацию https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSProgressIndicator_Class/index.html – AK1

+0

@Tommy Да, это детерминированный бар, который не отображается любой прогресс (он остается серым). – PjotrC

ответ

6

Вы не сможете продемонстрировать индикатор выполнения в такой замкнутой петле.

Когда вы устанавливаете значение индикатора прогресса, механизм отображения 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 секунду.

+1

'progressbar.indeterminate = false' отсутствовал в моем коде ... Я загружаю файлы в свой цикл, поэтому здесь не нужна задержка. Но я буду помнить ваш пример для использования в будущем. Большое спасибо. – PjotrC

 Смежные вопросы

  • Нет связанных вопросов^_^