2009-11-24 16 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]; }

相关问题