2009-11-28 161 views
11

我開發了一個帶有標籤欄和導航控制器的iPhone應用程序。如何在終止應用程序之前保留iPhone應用程序狀態?

它現在工作正常。

現在我希望應用程序在退出之前保存其狀態。

假設我有6個標籤。如果來電來了,所以重新推出該應用程序後,我應該看到選項卡中選擇這是最後選擇。

我看到關於這一主題的幾個問題,但我更糊塗看到他們後,

誰能告訴我一個直接的方式來做到這一點?

回答

27

沒有「一刀切」,確切的答案,這個問題 - 節能將在應用程序的結構有很大不同,以至於任何單一的解決方案不可能滿足您的特定情況下的應用程序的執行狀態。

有一些通用的技巧和指針,但是,應該把你在正確的道路上發展良好的狀態保持的解決方案:

  1. 通常你將要執行任何操作來保存applicationWillTerminate:狀態在您的應用程序委託中或通過在其他類中偵聽。

  2. Look at NSUserDefaults.您可以使用NSUserDefaults來存儲與首選項或其他信息相關的鍵/值對(類似於NSDictionary,儘管您只能存儲在NSUserDefaults中實現NSCoding的對象)。使用NSUserDefaults來存儲狀態信息。一個警告 - 你不應該使用NSUserDefaults來存儲大量數據,因爲這會減慢你的應用程序的啓動時間(因爲這些值是在啓動時加載的)。

  3. 更具體到你的情況......如果你想要做的只是保留應用程序之間的選定選項卡,你應該實現applicationWillTerminate:並使用NSUserDefaults來存儲選定的選項卡索引。然後,在您的applicationDidFinishLaunching:實現中,您將檢查是否存在該NSUserDefaults鍵,並將UITabBarController的選定索引設置爲存儲的值(如果存在)。

  4. 如果您希望能夠恢復所選標籤的導航堆棧,那麼您需要存儲足夠的信息,以便可以準確重建導航堆棧。你應該存儲在NSUserDefaults中的信息在一般意義上很難量化,因爲它對於應用程序的結構以及導航堆棧中視圖控制器層次結構的可能迭代非常具體。

  5. 如果您需要恢復更一般的導航堆棧,包括可能輸入的用戶數據,當應用程序關閉時您不想丟失(例如,如果用戶正在創建某種新記錄) ,我建議您將注意力從應用程序委託級別的應用程序狀態轉移出來,而不是專注於讓您的視圖控制器類監聽並執行其自己的特定狀態保存。您還必須確定一些機制,以便在終止時使用每個視圖控制器保存的信息來恢復導航層次結構。這是一種更復雜的技術,根據您的需要可能不需要。

遺憾的是這樣的回答有點含糊不清的,特別是對於更一般的和複雜的情況下,因爲我注意到有這個問題沒有通用的解決方案,因爲它使在很大程度上取決於你的應用程序結構。

這裏的NSUserDefaults的使用的例子:http://robertcarlsen.net/2009/06/19/overly-simplistic-saving-state-in-of-for-iphone-847

+0

可以提供任何例子或教程鏈接 – harshalb 2009-11-28 05:56:44

+0

#5正是諸如此類的事情,我期待的事情。就我而言,我正在使用核心數據。在VC堆棧的基礎上,您可以選擇現有的「根」管理對象,或創建一個新的。該對象然後傳遞到下一個VC進行編輯。此外,可以選擇/編輯屬性,因此有這種持續的先決條件。由於我可以將選擇保存在頂部(順序在運行之間不會改變),所以我懷疑我需要從底部到頂部「走棧」並重新創建它。我覺得我應該在這裏真的使用NSCoding,但它似乎與這種恢復不一致。嗯。 – 2010-05-10 14:28:12

+0

這個庫看起來很有用:https://github.com/enormego/EGOViewStackPersistence – pix0r 2011-05-17 15:14:01

相關問題