2012-08-17 52 views
0

我認爲這可能只是歸結爲我沒有完全理解當應用程序獲得內存警告時應該做的正確事情(或者我不明白iOS發生內存警告時自己做了什麼)。如何保存視圖控制器由於內存警告而被卸載時的狀態?

這裏是我的問題的一個簡化版本:

我有一個RootViewController。它推動TextViewController,我有一個UITextFieldTextViewController可以推送顯示一些細節的DetailViewController

如果我一路推到DetailsViewController,讓我的導航視圖控制器堆棧[RootVC, TextVC, DetailVC],然後模擬內存警告,TextVC被從內存中自動卸載的iOS。

問題1: iOS只是決定我的視圖控制器應該卸載。當用戶彈出DetailVC返回到TextVC,我應該在哪裏保存狀態信息(例如在文本字段中輸入的文本)?現在,文本字段只是回到空白,因爲視圖控制器已卸載然後重新加載。

問題2:當我突然回 TextVC和挖掘文本字段,我的應用程序崩潰。打開殭屍透露,某些 UIView從某處發現了一個 responderDidBecomeActive:消息,當我點擊文本字段。 ARC如何實現這個目標?在我的 viewDidUnload方法中,我將文本字段設置爲零,甚至將其委託屬性設置爲零。

編輯。 新問題:我只是通過覆蓋 didReceiveMemoryWarningTextVC完全解決了所有問題,並且它沒有做任何事情。從1到非常糟糕的規模,這有多糟糕?

EDIT 2 開玩笑,我是個白癡忘了刪除一個通知的觀察者在一個完全不同但相關的代碼。我還是不明白在iOS拋出你的廢話時應如何保存狀態信息。

回答

2

想想這個的方法如下。當你得到viewDidUnload時,系統已經清除了所有的UI元素。當你回到你的視圖時,系統將重新加載筆尖,你會得到viewDidLoad(再次),顯然所有的數據和設置將會丟失。

解決方案是在任何可能卸載的viewConroller中,您將保存用戶在ivars中輸入或設置的任何數據 - 您將在NSString中將文本保存爲intstance。在viewDidLoad中,您可以查看該字符串,並且如果其中有數據,則會初始化文本字段。

我告訴你的所有內容都與ios5相關。蘋果公司將在未來改變它的做法,但我不能在這裏談論它,因爲我在WWDC學到的東西是不披露的。也就是說,通過查看一些WWDC視頻或閱讀私人開發者列表,您可能會很快找到它。你應該爲你將要學習的東西感到高興!

+0

我還沒有看過新的NDA東西,所以我很高興聽到他們正在解決這個問題。我有一個強大的NSString屬性,我將其設置爲文本字段的值,但是當我觸發內存警告並且視圖被卸載,然後嘗試訪問'viewDidLoad'中的屬性時,它返回到nil。我錯過了什麼...? – 2012-08-17 15:51:20

+0

沒關係,一切工作都應該如此。現在聽起來很愚蠢,但我在iOS開發的幾年中並沒有想到,* view *在這裏被卸載,而不是* view controller *。 – 2012-08-17 16:14:30

+0

我相信筆尖內的所有東西都會被卸載,但現在我正在質疑這一點!對於視圖和視圖中的任何內容!在幾個月內,它的一切都將改變 - 爲了更好! – 2012-08-17 18:28:33

相關問題