条件
基本上,该应用程序会在短时间内从后台返回。
问题
布局没问题,但是从BackData恢复后,我从CoreData获得的一些属性是空的。几乎所有的视图控制器都存在这个问题。
项目
这是一个具有主tabbar控制器的应用程序,在选项卡中有两个导航控制器,可能还有两个级别的viewcontrollers,它们自己有子UIViews(使用一些信息)。后端由Parse和CoreData组成。
奇怪的部分
从背景返回 - > viewWillAppear上的属性正常(创建id的备份) - >它们是以后的零秒 - >我需要手动取回它们(来自我刚刚存储的ID)
这是一个截图,当在每5秒调用一个函数中放置一个断点来检查当前时间(link to bigger)时:
我做了什么
NSCoder实现了状态恢复,每个视图控制器都有一个恢复ID,但是当应用程序变为活动状态时,它不会被调用。我不认为NSCoder是这里的问题,因为从操作系统将自己杀死它或者强制退出用户时使用它的文档。
如果NSManagedObjects为nil,我尝试从NSNotificationCenter手动刷新相应ViewControllers中的内容,但它不是面向未来的,并且在每个视图上都不是相同的逻辑。
有什么想法?谢谢!
我的AppDelegate:
- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(@"Will Resign Active");
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"Entered Background");
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(@"Will enter Foreground");
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[[NSNotificationCenter defaultCenter] postNotificationName:@"needsRefresh" object:self userInfo:nil]; // Helpful in some viewcontrollers to save variables that are not nil.
[PF_FBSession.activeSession handleDidBecomeActive];
}
- (void)applicationWillTerminate:(UIApplication *)application
{
NSLog(@"Will Terminate");
}
答案 0 :(得分:2)
对于那些找到这个帖子的人来说,这是我找到的解决方案。
我的问题和答案是针对我的项目的。
我有另一个控制器,一个负责我所有数据库连接的控制器,它正在监听applicationDidBecomeActive。 这是调用我的数据的刷新,但也是一个清理",即删除/编辑一些NSManagedObjects,然后保存。
结论:内存地址不一样,对象也没有被认为是相同的,因此在我当前的页面上是空的。
我通过停止清理每个AppDidBecomeActive来修复它,但改为将该逻辑移到AppDidFinishLaunching。
希望有所帮助!