2015-11-13 64 views
-1

我創建並開始在我ViewControllers的一個自我重複計時器運行的計時器(姑且稱之爲VC1)有某種影像的幻燈片。當轉換到任何其他VC時,VC1的計時器似乎會繼續運行,因爲其選擇器方法每兩秒打印一次。由於這會干擾定時器從任何其他VC返回到VC1時,我必須在某個時刻刪除它。爲您在任何視圖控制器

這是在控制檯中會發生什麼:(runImages()是定時器的選擇,數量應該顯示,當你看到它的怪異圖像...)

console output

  1. 我想一旦我退出VC1,因爲我不救它的任何地方定時器將停止。由於情況並非如此,我想我可能會在離開VC1時刪除定時器。當VC1即將被解僱時,是否有一種方法正在被調用?

  2. 另一種方法,我在腦海裏在其他VC的源代碼開始刪除任何計時器。所以,當我輸入VC2時,我想檢查項目中正在運行的任何定時器。有沒有辦法做到這一點,而不要讓計時器成爲所有VC都可以訪問的全局變量?

代碼參考

這是如何創建的定時器:(方法外)

var timer: NSTimer! 

然後,在方法我將它設置:

timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "runImages:", userInfo: nil, repeats: true) 

runImage()然後增加i並調用changeImage(),這會將我的imageView圖像轉換爲第e圖像名稱爲i

感謝提前:)

更新

我做定時器的全局變量是每一個VC訪問。該應用程序在VC1中啓動,然後我轉換到VC2。在那裏,我插入了這個代碼:if let t = timer {t.invalidate()}if timer.valid {timer.invalidate()}。現在那不差,定時器的選擇方法保持印刷的東西...

+1

當u退出在viewDidDisappear方法VC1你爲什麼不失效計時器? –

+0

那是我的問題。 – LinusGeffarth

+0

所以你問如何做到這一點? –

回答

1

你應該保持在被「使用」它視圖 - 控制定時器的參考...

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) 
    } 
} 
+0

你試過你的代碼嗎?我遇到了'timer = nil' – LinusGeffarth

+0

的問題。代碼已更新! –

+1

此時您不需要檢查計時器是否爲零。 – Tyrelidrel

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() 
    } 
} 
+0

你沒有在任何地方啓動計時器... –

+0

是的,但它不工作。 – LinusGeffarth

+0

我的錯誤...使用NSTimer.scheduledTimerWithTimeInterval。我已經修改了上面的例子 –

相關問題