如何让 NSTimer 在返回 ViewController 时重新开始更新标签?

How do I get NSTimer to restart updating a label when returning to a ViewController?

我有一个基本的计时器应用程序(有点复杂的开始),我试图让用户打开一个新视图,更改一些设置,然后 return 到时间屏幕并让计时器继续滴答作响。

目前,当用户 return 进入计时器屏幕 ViewController 时,我的计时器仍在启动并将时间打印到控制台,但标签已停止更新。

如何启动计时器再次更新标签?

class Countdown 
{
    var initial = 100
    var count = 100
    var timer: NSTimer!
    var timerRunning = false
}

var globals = Countdown()

class ViewController: UIViewController {

@IBOutlet weak var timer1Label: UILabel!

@IBAction func unwindSegue(sender: UIStoryboardSegue) {} // Added to get rewind segue to work as recommended by Ben Sullivan

@IBAction func timer1(sender: AnyObject) 
{
    globals.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(ViewController.timerRunning), userInfo: nil, repeats: true)
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

func timerRunning()
{
    globals.timerRunning = true
    let minutes = (globals.count / 60) % 60;
    let seconds = globals.count % 60
    print("\(minutes):\(seconds)")
    globals.count = globals.count - 1
    timer1Label.text = String("\(minutes):\(seconds)")
} 

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

目前,设置视图控制器上没有任何内容 - 只是一个 return 用户 ViewController 的按钮。

问题是您正在对您的计时器视图控制器执行新的 segue。这将创建一个新的计时器视图控制器实例,而不是返回到原始实例。

首先删除从第二个控制器到第一个控制器设置的转接。然后,您将需要使用一个 unwind segue,您可以按照下面的 link 了解如何执行此操作。 (我最近遇到了和你一样的问题,这也是我提供的)

https://developer.apple.com/library/ios/technotes/tn2298/_index.html

通过使用 unwind segue,您不需要添加任何额外的代码,因为原始控制器上的标签应该仍在更新。