таймер не работает в какао / Mac OS в Swift 4 - PullRequest
0 голосов
/ 29 января 2019

Не могу понять, почему это время не обновляется.Искал весь день.Я не знаю, связано ли это с моим первым проектом MacOs, и, возможно, что-то ускользает от меня, но я бы хотел помочь.

import Cocoa

class TextViewController: NSViewController {

@IBOutlet weak var text: NSScrollView!

@IBOutlet weak var dreadline: NSTextField!

var seconds: Int = 60
var timer: Timer?

var theWork = Dreadline(email: "", worktime: 0)

override func viewDidLoad() {
    super.viewDidLoad()
    print(seconds)

    let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
        print(self.seconds)
        self.updateTimer()
    } // this is the timer that doesn't work no matter what I try :(
}

@objc func updateTimer() {
    if seconds < 1 {
        timer?.invalidate()
    } else {
        seconds -= 1     //This will decrement(count down)the seconds.
        dreadline.stringValue = "Dreadline: " + timeString(time: TimeInterval(seconds)) //This will update the label.
    }
}

1 Ответ

0 голосов
/ 29 января 2019

Очень распространенная ошибка: вы создаете локальный таймер, который не совпадает с объявленным свойством.

Замените

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
    print(self.seconds)
    self.updateTimer()
} // this is the timer that doesn't work no matter what I try :(

на

self.timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
    print(self.seconds)
    self.updateTimer()
} // this is the timer that doesn't work no matter what I try :(

self до timer фактически не является обязательным.

И установите таймер на nil после аннулирования, чтобы избежать цикла сохранения

if seconds < 1 {
    timer?.invalidate()
    timer = nil
}

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

Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
    print(self.seconds)
    self.updateTimer(timer)
} 

func updateTimer(_ timer : Timer) {
    if seconds < 1 {
        timer.invalidate()
    } else {
        seconds -= 1     //This will decrement(count down)the seconds.
        dreadline.stringValue = "Dreadline: " + timeString(time: TimeInterval(seconds)) //This will update the label.
    }
}
...