Search code examples
iosswifttimerios8-today-widgettoday-extension

Is it possible to refresh a timer in a Today Widget?


I was wondering is it possible to update the text label of a timer in a today widget. I took a look around but nothing helped me.


Solution

  • Yes you can. I have just tested and it works. You just have to add your timer to the main run loop NSRunLoopCommonModes:

    RunLoop.main.add(yourTimerName, forMode: .commonModes)
    

    import NotificationCenter
    
    class TodayViewController: UIViewController, NCWidgetProviding {
    
        @IBOutlet weak var strTimer: UILabel!
    
        var timer = Timer()
    
        func updateInfo() {
            strTimer.text = Date().description
        }
        override func viewDidLoad() {
            super.viewDidLoad()
            timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateInfo), userInfo: nil, repeats: true)
            RunLoop.main.add(timer, forMode: .commonModes)
        }
        func widgetPerformUpdate(completionHandler: @escaping (NCUpdateResult) -> Void) {
            completionHandler(.newData)
        }
    }