тип ‘UIViewController’ не имеет элемента updateTimer

#swift

#swift

Вопрос:

Я пытаюсь получить доступ к свойству timer в UIViewController

Для самой последней версии swift UIViewController , похоже, нет элемента «updateTimer»

 class InGameViewController: UIViewController {

    @IBOutlet weak var countdownTimerLabel: UILabel!
    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var pointsLabel: UILabel!

    @IBOutlet weak var initialCountdownLabel: UILabel!

    var seconds = 5 
    var timer = Timer()
    var isTimerRunning = false 

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        let value = UIInterfaceOrientation.landscapeLeft.rawValue
        UIDevice.current.setValue(value, forKey: "orientation")

         }

    func runTimer() {

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

Комментарии:

1. попробуйте self.updateTimer не добавляет UIViewController

Ответ №1:

сначала вам необходимо создать функцию updateTimer, которая будет использоваться в вашей функции выбора функции scheduledTimer. убедитесь, что вы оформили его как objc.

Также удалите UIViewController в функции selector, поскольку функция присутствует только в ВАШЕМ текущем классе viewcontroller (InGameViewController), а не в родительском классе UIViewController.

     @objc func updateTimer() {
             print("timer updated")
    }

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

Ответ №2:

UIViewController не имеет свойства, вызываемого updateTimer

Я не думаю, что вы можете просто вызвать свойство в #selector() , поскольку оно имеет неправильную подпись и приведет к сбою.

для справки ссылка на API на то, что вы вызываете:https://developer.apple.com/documentation/foundation/timer/1412416-scheduledtimer

Ответ №3:

 class InGameViewController: UIViewController {

    @IBOutlet weak var countdownTimerLabel: UILabel!
    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var pointsLabel: UILabel!

    @IBOutlet weak var initialCountdownLabel: UILabel!

    var seconds = 5 
    var timer = Timer()
    var isTimerRunning = false 

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        let value = UIInterfaceOrientation.landscapeLeft.rawValue
        UIDevice.current.setValue(value, forKey: "orientation")

         }

    func runTimer() {

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

@objc func updateTimer() {
             print("timer updated")
    }