iPhone如何保存视图状态

我现在已经开发了大约3个月的iphone应用程序,这些东西让我感到困惑,而且我真的不知道如何处理它们。

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

但是,如何创build一个应用程序,导航和保留其视图中的所有信息,直到应用程序closures。

谢谢 :)

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

使视图控制器成为一个伊娃,当你将它推到堆栈上时,你只能实例化一次。

 // 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...] ,否则很快你的应用程序将被杀死。 你应该以这种方式看到的是,观点在击中断点之前不会消失,并且在那之后消失。

如果假设是正确的,你应该find一个方法来保存viewDidUnload中的视图的状态,并在viewDidLoad恢复它。 请参阅didReceiveMemoryWarning参考。

尝试将数据保存在NSUserDefaults它很小或者使用plist或者它太小了,比如5-10个对象保存在NSUserDefaults中的某个variables中,如果它太大,使用sqlite并且保存像xml这样的文件的图像,则使用Document directory

UINavigationController的工作方式就像一个堆栈:您可以在其上推送和popupUIViewControllers。 这意味着当一个UIViewController被popup时,它的保留计数会减1,如果没有其他对象持有对它的引用,它将被释放。 你可以避免UIViewControllers通过调用对对象的保留来引用它们,例如在你的appDelegate中。

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

所以每当你加载一个视图,设置值的控制,使它看起来像从我们离开的地方恢复。