обновление переменных метки из запущенного таймера - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь создать счетчик, который выполняет простую математику, когда таймер достигает нуля.У меня таймер работает несколько корректно, а метки отображают исходные переменные, но они не обновляются, когда таймер достигает «нуля».Где я ошибаюсь в своем коде?

    class ViewController: UIViewController {


    @IBOutlet weak var timerLabel: UILabel!
    @IBOutlet weak var goldCounter: UILabel!
    @IBOutlet weak var turnCounter: UILabel!

    var seconds = 15
    var timer = Timer()
    var gold = 1000
    var turns = 1



    func updatelabels () {
    goldCounter.text = String(gold)
    turnCounter.text = String(turns) }




    func runTimer() {
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimer),userInfo: nil, repeats: true)
    }

    @objc func updateTimer() {
        seconds -= 1
        timerLabel.text = String(seconds)
        if seconds == 0 {
            seconds = 15}
        }


    func increaseGold () {
        if seconds == 1 {
            gold = gold + 1000
            turns = turns + 1
        }}

override func viewDidLoad() {
        super.viewDidLoad()
        self.runTimer()
        goldCounter.text = String(gold)
        turnCounter.text = String(turns)
        // Do any additional setup after loading the view, typically from a nib.

    func increaseGold () {
        if seconds == 1 {
            gold = gold + 1000
            turns = turns + 1
        }}
   func updatelabels () {
        goldCounter.text = String(gold)
        turnCounter.text = String(turns) }

    }
}

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Ваша основная проблема заключается в том, что вы не звоните updateLabels для обновления своих меток.

Я бы предложил использовать наблюдатели свойств (didSet) для установки ваших меток при изменении значений вместо того, чтобы полагаться наотдельная функция для их изменения.

Также вам нужно вызвать increaseGold в вашем обработчике таймера:

class ViewController: UIViewController {

    @IBOutlet weak var timerLabel: UILabel!
    @IBOutlet weak var goldCounter: UILabel!
    @IBOutlet weak var turnCounter: UILabel!

    var seconds = 15 {
        didSet {
            timerLabel.text = String(seconds)
        }
    }

    var timer = Timer()

    var gold = 1000 {
        didSet {
            goldCounter.text = String(gold)
        }
    }

    var turns = 1 {
        didSet {
            turnCounter.text = String(turns)
        }
    }

    func runTimer() {
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimer),userInfo: nil, repeats: true)
    }

    @objc func updateTimer() {
        seconds -= 1
        if seconds == 0 {
            seconds = 15
        }
        increaseGold()
    }

    func increaseGold () {
        if seconds == 1 {
            gold = gold + 1000
            turns = turns + 1
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        seconds = 15
        gold = 1000
        turns = 1
        self.runTimer()
    }
}
0 голосов
/ 23 октября 2018

Я думаю, что когда вы добавили let, ваша проблема исчезла.Удалить var timer = Timer().Это не обязательно

func runTimer() {
    let timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimer),userInfo: nil, repeats: true)
}
...