首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在冷启动时将iOS 7应用程序还原为ViewController

如何在冷启动时将iOS 7应用程序还原为ViewController
EN

Stack Overflow用户
提问于 2014-02-12 14:03:08
回答 4查看 622关注 0票数 1

我已经编码我的应用程序返回到一个特定的视图控制器重新启动。我要它从核心数据中提取数据。如果这个应用程序只是后台的话,它就能正常工作。但是,如果应用程序被终止并启动冷,它将转到AppDelegate中指定的顶级视图控制器。我搜索过StackOverflow和其他论坛,但是没有发现任何解决这个问题的方法。

应用程序代表已经选择加入。我在用故事板。我想重新启动的视图控制器在情节提要中有一个恢复ID。视图控制器还实现了encodeRestorableStateWithCoder和decodeRestorableStateWithCoder。我已经按照苹果的建议设置了它,但它并不是在冷启动的情况下工作。

我有三个问题:

  1. 如何迫使应用程序在冷启动时重新启动到这个特定的视图控制器(一个在顶层以下)?
  2. 一旦它在冷启动时重新启动到目标视图控制器,如何恢复核心数据?是否应该将核心数据写入磁盘并从磁盘中恢复?或者,我是否可以将足够的信息写入磁盘(即关键数据),以便从核心数据中提取数据?
  3. 是否有一个很好的教程,从冷启动恢复?我发现的只是恢复瞬态数据,而不是显示如何返回非顶层视图控制器。

提前谢谢你!

从AppDelegate中添加适用的代码。如果用户是在配置文件详细信息屏幕上,我想返回到那里,即使是从冷开始。我能够确认配置文件ID正在写入磁盘,并且正在读取它。我没有在故事板上为ProfileVC检查“是初始视图控制器”。但无论如何,它还是会返回给ProfileVC。

代码语言:javascript
运行
复制
NSDictionary *settings = [self readAppState];
if ([settings objectForKey:PROFILE_ID_DICT_NAME]) {
    NSLog(@"AppDelegate: didFinishLaunchingWithOptions: PROFILE_ID_DICT_NAME = %@",
          [settings objectForKey:PROFILE_ID_DICT_NAME]);
    ProfileDetailsVC *controller = (ProfileDetailsVC *) navigationController.topViewController;
    controller.managedObjectContext = self.managedObjectContext;
} else {
    NSLog(@"AppDelegate: didFinishLaunchingWithOptions: PROFILE_ID_DICT_NAME is null");
    ProfileVC *controller = (ProfileVC *)navigationController.topViewController;
    controller.managedObjectContext = self.managedObjectContext;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-12 14:11:27

你可以这样做:

代码语言:javascript
运行
复制
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {


    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

    //do your core data load here

    if(your core data condition){
        UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"someViewController"];
        self.window.rootViewController = viewController;
    } else {
        UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"someOtherViewController"];
        self.window.rootViewController = viewController;
    }

    [self.window makeKeyAndVisible];

    // Override point for customization after application launch.  
    return YES;
}

小心,instantiateViewControllerWithIdentifier引用的是故事板标识符,而不是类名。

票数 0
EN

Stack Overflow用户

发布于 2014-02-13 08:19:07

必须将唯一的恢复标识符分配给需要还原的所有视图控制器。这包括:

  1. 你真正感兴趣的那些
  2. 根视图控制器
  3. 之间的任何其他视图控制器

因此,如果您有一个选项卡条控制器,其中一个选项卡包含一个nav控制器,并且它有一个根控制器,那么所有3个都必须具有要还原的根控制器的恢复标识符。

票数 1
EN

Stack Overflow用户

发布于 2014-02-13 08:34:59

首先,看看本教程,我认为您可以在这里找到一些有用的东西-- NSCoding

以及视图控制器之间的切换。您能提供更多的细节,以便我们可以帮助您提供更好的解决方案。从冷启动转换的目的是什么?前面的例子,如果用户登录或不登录。

更新

考虑到您拥有存储所有配置文件的数据库,无论是本地数据库还是远程数据库。当用户打开配置文件时,您可以保存配置文件的id (id、本地数据库或用户默认值),然后当应用程序启动时,添加签入路由视图控制器

代码语言:javascript
运行
复制
NSString *savedProfile = [[NSUserDefaults standartDefaults] valueForKey:@"savedProfile"];
if (savedProfile) {
   //retrieve needed profile
   //open view with this profile
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21730138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档