检查在任何ViewController中运行的任何计时器

时间:2015-11-13 17:51:33

标签: ios swift uiviewcontroller timer nstimer

我在我的一个ViewControllers中创建并启动一个自重复计时器(让它称之为VC1),以便进行某种图像幻灯片放映。当转换到任何其他VC时,VC1的计时器似乎继续运行,因为其选择器方法每两秒打印一次。由于这会在从任何其他VC返回VC1时干扰定时器,因此我必须将其移除。

这是在控制台中发生的事情:( runImages()是计时器的选择器,数字是应该显示的图像,因为你看到它很奇怪......)

console output

  1. 我认为退出VC1后计时器会停止,因为我没有把它保存到任何地方。由于情况并非如此,我认为离开VC1时我可能会删除计时器。当VC1即将被解雇时,是否有一个被调用的方法?

  2. 我想到的另一种方法是删除其他VC源代码开头的任何计时器。因此,当我输入VC2时,我想检查项目中正在运行的任何计时器。有没有办法做到这一点,而不是让计时器成为所有VC都可以访问的全局变量?

  3. 代码参考

    这就是我创建计时器的方法:(在方法之外)

    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()}。现在没有区别,计时器的选择器方法可以保持打印...

2 个答案:

答案 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()
    }
}