当UIImagePickerController卸载我的控制器时,如何避免数据丢失?

时间:2009-11-24 04:06:05

标签: iphone

我正在使用UIImagePickerController从相机拍摄照片。但是,我发现随机调用控制器(显示UIImagePickercontroller之前显示的控制器)会被卸载。我记录了viewDidUnload,确实它被调用了。当相机完成并关闭时,我的控制器的viewDidLoad将被调用,不幸的是现在所有状态都已消失。输入的文字或选中的内容将会消失。

显然,这与内存不足有关。但这种行为是正常的吗?我应该处理吗?这通常不是modalViewController的工作原理。通常你会展示并解散它,一切都应该完好无损。

在这种情况下避免数据丢失的好方法是什么?我是否应该编写一堆代码来保存完整状态?

3 个答案:

答案 0 :(得分:3)

正在发生的事情是您的视图控制器的didReceiveMemoryWarning正在被调用,然后由于您的视图不可见,所以它正在被卸载。

解决方案是,任何想要持久化的数据都应存储在视图控制器中,而不是存储在视图中。

您可以通过在didReceiveMemoryWarning类中提供UIViewController的实现来阻止这种情况发生,调用[super didReceiveMemoryWarning],这是卸载视图发生了,但尝试理解正在发生的事情仍然是一件好事。

答案 1 :(得分:2)

覆盖-didReceiveMemoryWarning是不可取的,这样UIViewController就无法解除分配视图,因为这样你可能遇到内存不足的“真正”问题,你的应用程序将被系统退出。 / p>

您真正应该做的是在-didReceiveMemoryWarning方法中保存视图中输入数据的文本和其他位(确保调用super)。然后在-viewDidLoad中,您可以将文本和其他位放回UI中。

这将减轻内存使用量并降低应用程序被强制退出的可能性,因为没有剩余内存。一直以来,用户都不会知道它已经消失了!

答案 2 :(得分: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]; }