iPhone如何保存视图状态
我已经开发了大约3个月的iphone应用程序,有一些事情让我感到困惑,我真的不知道如何解决它们 我有一个导航控制器控制我的应用程序中的视图,但是每个被加载、使用然后被推回的屏幕都会丢失所有的信息,因为它似乎是重新启动的。。。我相信这是一个可能的内存管理问题 但是如何创建一个应用程序,在应用程序关闭之前导航并保留其视图中的所有信息iPhone如何保存视图状态,iphone,objective-c,ios,cocoa-touch,ios4,Iphone,Objective C,Ios,Cocoa Touch,Ios4,我已经开发了大约3个月的iphone应用程序,有一些事情让我感到困惑,我真的不知道如何解决它们 我有一个导航控制器控制我的应用程序中的视图,但是每个被加载、使用然后被推回的屏幕都会丢失所有的信息,因为它似乎是重新启动的。。。我相信这是一个可能的内存管理问题 但是如何创建一个应用程序,在应用程序关闭之前导航并保留其视图中的所有信息 谢谢:)您的应用程序可能正在接收到一条direceivememorywarning 在这种情况下,当调用超级类时,框架通过卸载当前未显示的所有视图来进行内存清理。这可以
谢谢:)您的应用程序可能正在接收到一条
direceivememorywarning
在这种情况下,当调用超级类时,框架通过卸载当前未显示的所有视图来进行内存清理。这可以解释你所看到的行为
要进一步检查,请在其中一个视图控制器中覆盖didReceiveMemoryWarning
,或在应用程序代理中覆盖applicationDidReceiveMemoryWarning
,并在其中设置断点。别忘了适当地调用[super…]
,否则你的应用程序很快就会被杀死。通过这种方式,您应该看到视图在到达断点之前不会消失,而在到达断点之后会消失
如果假设是正确的,您应该找到一种方法,在
viewDidUnload
中保存视图的状态,并在viewDidLoad
中恢复它。另请查看参考。尝试将数据保存在NSUserDefaults
中,它太小或使用plist
或太小,如5-10个对象保存在appDelegate
中的某个变量中,如果它太大,请使用sqlite
,并使用Document directory
保存文件的图像,UINavigationController就像一个堆栈:您可以在其上按下并弹出UIViewControllers。这意味着当UIViewController被弹出时,它的保留计数将减少1,如果没有其他对象持有对它的引用,它将被释放。您可以通过在对象上调用-retain(例如在您的appDelegate中)保留对UIViewController的引用来避免UIViewController被解除分配。您可以使用保存视图中uicontrol的状态
因此,无论何时加载视图,都要设置控件的值,使其看起来像是从我们离开的地方恢复 在本部分中:
MyViewController *myViewController=[MyViewController alloc] initWithNibName:@"myView" bundle:nil];
[[self navigationController] pushViewController:myViewController animated:YES];
[myViewController release];
你可能会有这样的事情。。。相反,将myViewController设置为类的属性,以便对其进行引用。并放下
[myViewController release]代码>语句。可能您没有保留对视图控制器的引用,问题是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 ....];
当然别忘了以后再发布。视图控制器弹出堆栈时不是已经发布了吗?这就是我一直在做的。但我认为有一个更简单的方法,将整个视图保存在内存中。每次推送和弹出页面时,它都必须访问我在nsuserdefaults中保存的内容?您能详细说明一下吗?我目前正在尝试使用uitextfield。按下viewcontroller,在uitextfield中键入文本,然后弹出。然后返回以查看文本是否仍然存在。保存我在文本字段中输入的数据以使用nsuserdefaults或其他东西的唯一方法是什么?@MrPink-控件的状态不会保存,因为UIViewController
会被释放。是否存在将状态保存到文件系统的问题?我不明白这一点。@MrPink-如果您想在再次按下/pop/push时保持状态,则不能释放UIViewController
,要做到这一点,只需将其注册为类中的ivar,当您需要按下它时,检查它是否为nil
(首次按下)并alloc/init它。然后,当您将它从堆栈中弹出时,它将不会被释放,除非您明确要求这样做。当您再次推送它时,除非您在viewdide:
中进行更新,否则控件的状态将保持不变,我仍在努力使其正常工作。我会继续摆弄你给我的所有信息,并让你知道:)@MrPink-唯一的区别是VC是定制类的ivar,而不是在你需要推送错误答案时声明为/alloc/init。请参考以上答案。“这就像一个魔术一样。”AbdulYasin,因为你可能是(在你的特殊情况下)。如果你看op问题,你会发现它太模糊了,无法给出客观的答案。