Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.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
Ios 应用程序进入/离开后台时保存和加载数据_Ios_Iphone_Objective C_Appdelegate_Nskeyedarchiver - Fatal编程技术网

Ios 应用程序进入/离开后台时保存和加载数据

Ios 应用程序进入/离开后台时保存和加载数据,ios,iphone,objective-c,appdelegate,nskeyedarchiver,Ios,Iphone,Objective C,Appdelegate,Nskeyedarchiver,我试图使我的游戏保持其当前状态,并在用户退出或重新启动游戏时重新加载它。然而,我正在努力解决的是如何在正确的时间访问对象。这是我需要的伪代码,我似乎无法访问正确的对象,我是在向后做还是这样做正确 再次重申,我的问题是访问正确的ViewControllers,以便从磁盘保存/加载数据 我的导航层次结构很简单,ViewController>GameViewController(以模式显示) 附加问题:这两个函数是否是我保存/加载的正确函数?或者,您可以在代码中的任何位置设置通知处理程序: [[NSN

我试图使我的游戏保持其当前状态,并在用户退出或重新启动游戏时重新加载它。然而,我正在努力解决的是如何在正确的时间访问对象。这是我需要的伪代码,我似乎无法访问正确的对象,我是在向后做还是这样做正确

再次重申,我的问题是访问正确的
ViewControllers
,以便从磁盘保存/加载数据

我的导航层次结构很简单,
ViewController>GameViewController
(以模式显示)


附加问题:这两个函数是否是我保存/加载的正确函数?

或者,您可以在代码中的任何位置设置通知处理程序:

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(handleEnteredBackground:) 
                                             name: UIApplicationDidEnterBackgroundNotification
                                           object: nil];

解决这一问题的正确方法是使用模型-视图-控制器模式(MVC)-因为(几乎)所有好的Cocoa iOS应用程序都应该:

  • 首先,确保要持久化的任何数据都存储在模型层/对象中
  • 如果视图控制器的状态经常更改,请使用视图控制器中的通知:
    UIApplicationWillEnterBackgroundNotification
    作为将状态保存到模型的触发器
  • 当在应用程序委托中收到
    ApplicationIdentinterBackground:
    消息时,将模型对象中的数据保存到文件系统
  • 当应用程序唤醒或重新启动时,将文件数据加载回模型,并通过自定义通知通知视图控制器,以便视图控制器知道如何恢复其相关状态

应用程序代理不应该到处从每个视图控制器中挑选要保存到文件系统的信息。

为什么不让每个视图控制器成为应用程序代理中的一个属性?我该如何实现呢?在应用程序代理的头文件中(上面的方法将在哪里)声明@property UIViewController*yourController;然后你可以根据需要访问你的VC,你总是有一个参考资料…谢谢,但是我该如何将这个属性与我的ViewController绑定呢?我正在使用interface builder btwSet NSMutableDictionary作为应用程序委托中的属性。在特定时间(如阶段完成)在VC中访问此字典变量。在这里,在字典中存储游戏的状态。然后在应用程序中输入后台,将字典数据写入到Prefrence/plist本地数据中。在应用程序中,将从本地目录读取并存储到您的字典变量中。您好,这非常有意义,但是GameViewController“拥有”了
GameEngine
模型,并且基本上每次显示视图时都会创建一个新模型,因此需要以某种方式从中提供/获取信息,因此,在
GameEngine
类中——假设您可以修改它——您可以创建一个保存方法,将其状态保存到文件中。或者,如果您不能修改它,您可以在另一个类中保留一个游戏引擎集合(如果有多个),并在该类上有一个保存方法,将游戏引擎的状态保存到文件中。上面Mano Khahil的评论提出了一种类似但更懒惰的方法。是的,这是我的,是的,我可以很容易地做到,我想我现在知道如何解决这个问题了,我会尝试一下,谢谢!
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(handleEnteredBackground:) 
                                             name: UIApplicationDidEnterBackgroundNotification
                                           object: nil];