нераспознанный селектор, отправленный экземпляру при использовании NSTimer - PullRequest
0 голосов
/ 02 сентября 2018

Когда я запускаю свой код, я сталкиваюсь с ошибкой консоли

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [_ Счетчик SwiftValue]: нераспознанный селектор отправлен в экземпляр

код следующий

class Status: UIViewController {
    @IBOutlet var health: UIProgressView!
    @IBOutlet var happiness: UIProgressView!
    @IBOutlet var energy: UIProgressView!
    @IBOutlet var hygiene: UIProgressView!
    @IBOutlet var pain: UIProgressView!
    @IBOutlet var hunger: UIProgressView!

    var total:Double = 1

    @objc func counter() {
       total -= 0.05
    }

    let timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector:#selector(counter), userInfo: nil, repeats:true)

    override func viewDidLoad() {
        super.viewDidLoad()

        hunger.setProgress(Float(total), animated: true)
        happiness.setProgress(Float(total), animated: true)
        energy.setProgress(Float(total), animated: true)
        hygiene.setProgress(Float(total), animated: true)
        pain.setProgress(Float(total), animated: true)
        health.setProgress(Float(total), animated: true)
    }
}

Также вот изображение полного сообщения об ошибке, которое я получаю Сообщение об ошибке

1 Ответ

0 голосов
/ 02 сентября 2018

Когда вы используете такое значение по умолчанию, self еще не полностью инициализировано. Используйте неявно развернутый необязательный параметр и переместите вызов в viewDidLoad:

var timer: Timer!

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

Предполагается, что вам не нужно timer до того, как контроллер представления завершит загрузку с пера, что должно происходить большую часть времени.

...