检查任何 ViewController 中的任何计时器 运行
Check for any timers running in any ViewController
我在我的一个 ViewController(我们称它为 VC1)中创建并启动了一个自重复计时器,以播放某种图像幻灯片。当转换到任何其他 VC 时,VC1 的计时器似乎保持 运行,因为它的选择器方法每两秒打印一次东西。由于这会干扰从任何其他 VC 返回到 VC1 时的计时器,所以我必须在某些时候将其删除。
这是控制台中发生的事情:(runImages() 是计时器的选择器,数字是应该显示的图像,如您所见,它很奇怪...)
我以为退出 VC1 后计时器会停止,因为我没有在任何地方保存它。由于情况并非如此,我想我可能会在离开 VC1 时删除计时器。 VC1 即将被解散时是否有方法被调用?
我想到的另一种方法是删除其他 VC 源代码开头的所有计时器。因此,当我输入 VC2 时,我想检查项目中是否有任何 运行 的计时器。有没有一种方法可以在不使计时器成为所有 VCs 都可以访问的全局变量的情况下做到这一点?
代码参考
这是我创建计时器的方式:(在方法之外)
var timer: NSTimer!
然后,在我设置的方法中:
timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "runImages:", userInfo: nil, repeats: true)
runImage()
然后增加 i
并调用 changeImage()
将我的 imageView 的图像转换为名为 i
.
的图像
提前致谢:)
更新
我将计时器设为每个 VC 都可以访问的全局变量。该应用程序在 VC1 中启动,然后我转换到 VC2。在那里,我插入了这段代码:if let t = timer {t.invalidate()}
和 if timer.valid {timer.invalidate()}
。现在这没什么区别,计时器的选择器方法会继续打印内容...
您应该在 viewcontroller 中保留对计时器的引用,即 "using" 它...
class ViewController: UIViewController {
var timer: NSTimer?
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
timer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("timerFired"), userInfo: nil, repeats: true)
}
func timerFired() {
// do whatever you want
}
override func viewWillDisappear(animated: Bool) {
if timer != nil {
timer?.invalidate()
timer = nil
}
super.viewWillDisappear(animated)
}
}
试试这个
import UIKit
class ViewController: UIViewController {
let timeInterval: NSTimeInterval = 5 // seconds
// The run loop maintains a strong reference already.
weak var timer: NSTimer?
func startTimer() {
// 1. invalidate previous timer if necessary
timer?.invalidate()
// 2. setup a new timer
timer = NSTimer.scheduledTimerWithTimeInterval(
timeInterval,
target: self,
selector: "timerFired",
userInfo: nil,
repeats: true
)
}
func stopTimer() {
timer?.invalidate()
timer = nil
}
// Need to include @objc marker here
// Function must not be private.
@objc internal func timerFired() {
/*
Perform any UI Updates or whatever...
*/
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
startTimer()
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
stopTimer()
}
}
我在我的一个 ViewController(我们称它为 VC1)中创建并启动了一个自重复计时器,以播放某种图像幻灯片。当转换到任何其他 VC 时,VC1 的计时器似乎保持 运行,因为它的选择器方法每两秒打印一次东西。由于这会干扰从任何其他 VC 返回到 VC1 时的计时器,所以我必须在某些时候将其删除。
这是控制台中发生的事情:(runImages() 是计时器的选择器,数字是应该显示的图像,如您所见,它很奇怪...)
我以为退出 VC1 后计时器会停止,因为我没有在任何地方保存它。由于情况并非如此,我想我可能会在离开 VC1 时删除计时器。 VC1 即将被解散时是否有方法被调用?
我想到的另一种方法是删除其他 VC 源代码开头的所有计时器。因此,当我输入 VC2 时,我想检查项目中是否有任何 运行 的计时器。有没有一种方法可以在不使计时器成为所有 VCs 都可以访问的全局变量的情况下做到这一点?
代码参考
这是我创建计时器的方式:(在方法之外)
var timer: NSTimer!
然后,在我设置的方法中:
timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "runImages:", userInfo: nil, repeats: true)
runImage()
然后增加 i
并调用 changeImage()
将我的 imageView 的图像转换为名为 i
.
提前致谢:)
更新
我将计时器设为每个 VC 都可以访问的全局变量。该应用程序在 VC1 中启动,然后我转换到 VC2。在那里,我插入了这段代码:if let t = timer {t.invalidate()}
和 if timer.valid {timer.invalidate()}
。现在这没什么区别,计时器的选择器方法会继续打印内容...
您应该在 viewcontroller 中保留对计时器的引用,即 "using" 它...
class ViewController: UIViewController {
var timer: NSTimer?
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
timer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("timerFired"), userInfo: nil, repeats: true)
}
func timerFired() {
// do whatever you want
}
override func viewWillDisappear(animated: Bool) {
if timer != nil {
timer?.invalidate()
timer = nil
}
super.viewWillDisappear(animated)
}
}
试试这个
import UIKit
class ViewController: UIViewController {
let timeInterval: NSTimeInterval = 5 // seconds
// The run loop maintains a strong reference already.
weak var timer: NSTimer?
func startTimer() {
// 1. invalidate previous timer if necessary
timer?.invalidate()
// 2. setup a new timer
timer = NSTimer.scheduledTimerWithTimeInterval(
timeInterval,
target: self,
selector: "timerFired",
userInfo: nil,
repeats: true
)
}
func stopTimer() {
timer?.invalidate()
timer = nil
}
// Need to include @objc marker here
// Function must not be private.
@objc internal func timerFired() {
/*
Perform any UI Updates or whatever...
*/
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
startTimer()
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
stopTimer()
}
}