Таймер обратного отсчета не будет работать, потому что он не будет принимать локальные функции - PullRequest
0 голосов
/ 10 июня 2019

Каждый раз, когда я пытаюсь определить функцию, когда я использую Timer.Scheduledtimer с селектором. Это показывает следующую ошибку. Я не уверен, как пройти через это. Также я хотел бы знать, могу ли я подключить ярлык к обратному отсчету, т. Е. на экране 0:59, 0:58 и т. д.

Спасибо.

Я уже пробовал различные функции с разных веб-сайтов, и всегда возникает одна и та же проблема

var seconds = 0

var timer: Timer?

let countdownLabel: SKLabelNode! = {   
let label = SKLabelNode(fontNamed: "BubbleGum")
   label.zPosition = 2
   label.color = SKColor.white
   label.position = CGPoint(x: 0 - 130, y:self.frame.size.height/15 
+ 390)
   return label
    }()
    countdownLabel.text = String(seconds)

    func counter (){
        seconds -= 1
        countdownLabel.text = String(seconds)
        if (seconds == 0)
        {
            timer!.invalidate()
        }

    }


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



    self.addChild(countdownLabel)



}

Это сообщение об ошибке появляется: Аргумент '#selector' не может ссылаться на локальную функцию 'counter ()'

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Либо аннотируйте вашу counter функцию с помощью @objc, либо используйте замыкание

@objc func counter () {
   ...
}

Использование замыкания:

timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { timer in
    seconds -= 1
    countdownLabel.text = String(seconds)
    if (seconds == 0)
    {
        timer!.invalidate()
    }
}
0 голосов
/ 10 июня 2019

Вы должны добавить @objc перед вашей функцией. Не забывайте добавлять @objc в вашу функцию, если вы собираетесь вызывать функцию внутри селектора

class ViewControlller: UIViewController {

        override func viewDidLoad() {
            super.viewDidLoad()
            //call it like this in viewdidload/viewdidappear
            timer = Timer.scheduledTimer(timeInterval: 1, target: self, 
      selector: #selector(counter), userInfo: nil, repeats: true)
        }


      //Declare this function outside any other func like viewdidload/viewdidappear
      @objc func counter(){
            seconds -= 1
            countdownLabel.text = String(seconds)
            if (seconds == 0)
            {
                timer!.invalidate()
            }

        }

}
...