2012-03-20 127 views
0

我有2個viewControllers在我的應用程序,從第一個視圖,當我導航到下一個有一個名爲startTimer的按鈕與一個定時器動作作爲選擇器方法點擊startTimer計時器啓動HH:mm:ss格式,我不是無效的計時器,但當我回到第一viewController和再次如果我再次來到第二viewController,如果我按下startTimer按鈕計時器再次從0開始,但我希望它保留以前的值,我怎麼能做到這一點?我知道,因爲我再次加載viewController的筆尖將被加載到內存,但我怎麼能保留計時器的標籤和計時器的價值? 任何幫助提前感謝,謝謝。如何保持NSTimer活着?

回答

0

不要這樣做,這種方式每次加載包含NSTimer的視圖時,都會創建一個新的NSTimer對象,而舊的對象仍在內存中,因爲您沒有使其失效。

最好的方法是,您必須將NSTimer放入應用程序委託中,然後僅在第一次加載該View Controller時才啓動它。

爲了實現這一點,您必須添加一個標誌來檢查視圖是否第一次加載。

0

如果NSTimer是你的實例變量之一,我想你可以做一個檢查,看看它是否被分配。


//NSTimer *timer; declare this in your interface 

if (timer==nil) 
{ 
    // allocate timer 
} 
//Do nothing if it is allocated all ready 

3

您已經通過將數據放入視圖控制器來打破MVC(模型 - 視圖 - 控制器)。而且,你所要求的機制沒有關於時間的堅定承諾(NSTimer)來跟蹤你的時間。 NSTimer不會在請求的時間間隔內觸發恰好爲。它可以在該時間間隔之後的任意點觸發。 使用 NSTimer作爲秒錶幾乎總是會失去時間(有時相當長時間,特別是如果有滾動視圖時)。 (最後一點被誇大了,一個重複的計時器正確地調度自己,所以通常不會浪費時間,如果重複被完全跳過,在長時間滾動或其他可以保持定時器觸發的事件中, )

創建一個新的模型對象來保存秒錶信息。我們稱之爲Stopwatch。假設你需要它可以啓動和停止,它需要一個NSTimeInterval accumulatedTime屬性和一個NSDate lastStarted屬性(如果你願意,你也可以使lastStarted爲)。因此,要啓動秒錶,請將lastStarted設置爲「now」。要停止秒錶,請清除lastStarted並將當前累計時間移至accumulatedTime。要查看當前時間,請將accumulatedTime添加到now - lastStarted

好的,現在你已經有了,你可以用它做什麼?您可以將它傳遞給您的視圖控制器,他們可以詢問「當前秒錶值是多少?」他們可以隨意啓動和停止它。

現在你的視圖控制器想要每秒更新它的顯示,所以你有一個計時器來做到這一點。它每秒鐘都會詢問秒錶「當前時間是什麼」,並顯示它。但它沒有設置的時間。它只是問。

順便說一下,你也可以在Stopwatch上使用KVO,但它有點棘手,因爲Stopwatch需要運行自己的計時器來發送更改通知。我通常覺得比它的價值更麻煩。

0

我會做的是將第二個視圖控制器作爲您的第一個視圖控制器的ivar。這樣,您可以僅實例化一次,並且您的NSTimer將保留在內存中。但是,如果你想保持你的風格,你應該保存當前時間的任何一種喜好(看[NSUserDefaults standardUserDefaults]或創建你自己的單身人士課程)。然後在視圖中從你的第二個視圖控制器加載方法,加載該值並將其添加爲您的定時器的偏移量。

希望能幫到你!