Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone如何保存视图状态_Iphone_Objective C_Ios_Cocoa Touch_Ios4 - Fatal编程技术网

iPhone如何保存视图状态

iPhone如何保存视图状态,iphone,objective-c,ios,cocoa-touch,ios4,Iphone,Objective C,Ios,Cocoa Touch,Ios4,我已经开发了大约3个月的iphone应用程序,有一些事情让我感到困惑,我真的不知道如何解决它们 我有一个导航控制器控制我的应用程序中的视图,但是每个被加载、使用然后被推回的屏幕都会丢失所有的信息,因为它似乎是重新启动的。。。我相信这是一个可能的内存管理问题 但是如何创建一个应用程序,在应用程序关闭之前导航并保留其视图中的所有信息 谢谢:)您的应用程序可能正在接收到一条direceivememorywarning 在这种情况下,当调用超级类时,框架通过卸载当前未显示的所有视图来进行内存清理。这可以

我已经开发了大约3个月的iphone应用程序,有一些事情让我感到困惑,我真的不知道如何解决它们

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

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


谢谢:)

您的应用程序可能正在接收到一条
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问题,你会发现它太模糊了,无法给出客观的答案。