iPhone如何保存视图状态



我开发iphone应用程序已经3个月了,有一些问题一直困扰着我,我真的不知道如何解决它们。

我有一个导航控制器控制我的应用程序中的视图,但是每个屏幕被加载,使用,然后推回失去了所有的信息,因为它似乎被重新建立…我相信这是一个可能的内存管理问题?

但是如何创建一个导航并保留视图中所有信息的应用程序,直到应用程序关闭。

谢谢:)

可能你没有保持对视图控制器的引用,问题是UIVIewController没有被释放。

让视图控制器成为一个ivar,当你把它放在栈上时,你只会实例化一次。

// in .h
MyViewController *mVC;
// in .m
// maybe when the user selects a row in a tableview
if(mVC == nil) {
    // first time use, alloc/init
    mVC = [[MyViewController ....];
}
// then push on the stack
[self.navigationController ....];

当然别忘了稍后再发布

本部分:

MyViewController *myViewController=[MyViewController alloc] initWithNibName:@"myView" bundle:nil];
[[self navigationController] pushViewController:myViewController animated:YES];
[myViewController release];

你可能会有这样的东西…相反,让你的myViewController成为一个类的属性,这样你就有一个对它的引用。并删除[myViewController release];语句

您的应用程序可能正在接收didReceiveMemoryWarning

在这种情况下,当调用超类时,框架通过卸载当前未显示的所有视图来清理内存。这可以解释您所看到的行为。

为了进一步检查它,在你的一个视图控制器中重写didReceiveMemoryWarning或在你的应用程序委托中重写applicationDidReceiveMemoryWarning,并在其中放置一个断点。不要忘记适当地调用[super...],否则你的应用程序很快就会被杀死。通过这种方式,您应该看到的是视图在到达断点之前不会消失,在到达断点之后会消失。

如果假设是正确的,您应该找到一种方法来保存viewDidUnload中视图的状态,并在viewDidLoad中恢复它。参考didReceiveMemoryWarning

尝试将数据保存在NSUserDefaults中,如果它很小或使用plist或它太小,如5-10对象保存在appDelegate中的一些变量中,如果它太大,使用sqlite和保存像xml这样的文件图像使用Document directory

UINavigationController的工作方式就像一个堆栈:你在它上面push和pop UIViewControllers。那意味着当一个UIViewController被弹出时,它会有它的保留计数递减1,如果没有其他对象持有对它的引用,它将被释放。你可以通过在对象上调用-retain来保持对它们的引用来避免uiviewcontroller被释放,例如在你的appDelegate中。

你可以使用NSUserDefaults来保存视图中uicontrol的状态。

所以当你加载一个视图时,设置控件的值,这样它看起来就像从我们离开的地方恢复。

最新更新