iPhone如何保存视图状态

时间:2011-07-26 09:13:14

标签: iphone objective-c ios cocoa-touch ios4

我现在已经开发了大约3个月的iphone应用程序,并且有一些事情让我感到困惑,我真的不知道如何围绕它们工作。

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

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

谢谢:)

6 个答案:

答案 0 :(得分:2)

可能您没有保留对视图控制器的引用,问题是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 ....];

当然不要忘记稍后发布。

答案 1 :(得分:1)

在这部分:

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

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

答案 2 :(得分:0)

您的应用可能正在收到didReceiveMemoryWarning

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

要进一步检查,请覆盖其中一个视图控制器中的didReceiveMemoryWarning或应用代理中的applicationDidReceiveMemoryWarning,并在其中添加断点。不要忘记恰当地致电[super...],否则你的应用很快就会被杀死。您应该以这种方式看到的是视图在到达断点之前不会消失,之后会消失。

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

答案 3 :(得分:0)

尝试将NSUserDefaults中的数据保存到较小的地方或使用plist,或者将其设置得太小,就像5-10个对象一样,保存在appDelegate的某个变量中,如果它太大使用sqlite并保存像xml这样的文件图像使用Document directory

答案 4 :(得分:0)

UINavigationController的工作方式类似于堆栈:您可以在其上推送和弹出UIViewControllers。这意味着当UIViewController被弹出时,它的保留计数将减1,如果没有其他对象持有对它的引用,它将被释放。您可以通过在对象上调用-retain(例如在appDelegate中)来自行保留对它们的引用来避免UIViewControllers被释放。

答案 5 :(得分:0)

您可以使用NSUserDefaults在视图中保存UIControl的状态。

因此,无论何时加载视图,都要将值设置为控件,使其看起来像是从我们离开的位置继续。