如何让 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,您不需要添加任何额外的代码,因为原始控制器上的标签应该仍在更新。
我有一个基本的计时器应用程序(有点复杂的开始),我试图让用户打开一个新视图,更改一些设置,然后 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,您不需要添加任何额外的代码,因为原始控制器上的标签应该仍在更新。