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的状态保存在视图中。
所以每当你加载一个视图,设置值的控制,使它看起来像从我们离开的地方恢复。