2009-11-24 77 views
3

我正在使用UIImagePickerController從相機拍照。然而,我發現我的調用控制器(顯示在UIImagePickercontroller之前的那個控制器)被卸載。我記錄了viewDidUnload,事實上它確實被調用。當相機完成並解散後,我的控制器的viewDidLoad將被調用,不幸的是,所有的狀態現在都消失了。像輸入的文本或選擇的東西將會消失。如何在UIImagePickerController卸載我的控制器時避免數據丟失?

顯然這是與內存不足有關。但這種行爲是否正常?我應該處理它嗎?這通常不是modalViewController的工作原理。通常您會顯示並解除它,一切都應該完好無損。

在這種情況下避免數據丟失的一種好方法是什麼?我是否需要編寫一堆代碼來保存完整狀態?

回答

2

重寫-didReceiveMemoryWarning確實不可取,因此UIViewController無法解除分配視圖,因爲這樣您可能會遇到內存不足的「真實」問題,並且系統會強制您的應用程序退出。

你真正應該做的是在-didReceiveMemoryWarning方法(確保調用super)中將視圖中輸入數據的文本和其他位存儲起來。然後在-viewDidLoad中,您可以將文本和其他位放回UI。

這將減輕內存使用量並降低應用程序被迫退出的可能性,因爲沒有剩餘內存了。一直以來,用戶都不會知道它永遠不會消失!

3

發生了什麼事是您的視圖控制器的didReceiveMemoryWarning正在被調用,然後由於您的視圖不可見,它正在被卸載。

解決方案是,任何想要持久化的數據都應該存儲在您的視圖控制器中,而不是您的視圖中。

您可以在您的UIViewController類,它提供的didReceiveMemoryWarning實現防止這種情況的發生是呼叫[super didReceiveMemoryWarning]這哪裏是視圖的卸載發生,但它仍然試圖瞭解發生了什麼好東西上。

0

我對上述相同問題的解決方案是在我的視圖控制器中聲明一個實例變量,該視圖控制器在視圖被卸載時存儲UITextView的內容。因此,在我的viewWillDissapear方法中,我將UITextView.text的內容保存到我的實例變量中,並在我的viewWillAppear方法中恢復內容。

- (void)viewWillAppear:(BOOL)animated 
{ 
    if (messageTextString != nil) 
    { 
     textEdit.text = messageTextString; 
    } 

    [super viewWillAppear:animated]; 
} 
  • (無效)viewWillDisappear:(BOOL)動畫 { self.messageTextString = textEdit.text;

    [super viewWillDisappear:animated]; }

相關問題