我在我的一个ViewControllers中创建并启动一个自重复计时器(让它称之为VC1),以便进行某种图像幻灯片放映。当转换到任何其他VC时,VC1的计时器似乎继续运行,因为其选择器方法每两秒打印一次。由于这会在从任何其他VC返回VC1时干扰定时器,因此我必须将其移除。
这是在控制台中发生的事情:( runImages()是计时器的选择器,数字是应该显示的图像,因为你看到它很奇怪......)
我认为退出VC1后计时器会停止,因为我没有把它保存到任何地方。由于情况并非如此,我认为离开VC1时我可能会删除计时器。当VC1即将被解雇时,是否有一个被调用的方法?
我想到的另一种方法是删除其他VC源代码开头的任何计时器。因此,当我输入VC2时,我想检查项目中正在运行的任何计时器。有没有办法做到这一点,而不是让计时器成为所有VC都可以访问的全局变量?
这就是我创建计时器的方法:(在方法之外)
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()}
。现在没有区别,计时器的选择器方法可以保持打印...
答案 0 :(得分:1)
你应该在viewcontroller中保留对“使用”它的计时器的引用......
$('#navbar').tabs({disabled: disabledTabs});
答案 1 :(得分:0)
试试这个
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()
}
}