Iphone iOS:崩溃后是否可以打开以前的viewController并重新启动应用程序?

Iphone iOS:崩溃后是否可以打开以前的viewController并重新启动应用程序?,iphone,ios,objective-c,Iphone,Ios,Objective C,如何做到这一点呢?请给我一些指导。我在下面描述我的问题 当我点击主页按钮并从托盘中移除应用程序时,当我打开应用程序时,我会看到登录屏幕。我知道如何很好地使用NSUserDefaults 但我的问题是,当我导航到第三或第四个viewController时,我按下Home按钮并从托盘中移除应用程序,然后每当我打开应用程序时,我都不想用上次打开的viewController打开 同样,当我的应用程序崩溃时,我再次打开它,然后我想用上次打开的viewController状态打开应用程序 所以我只想知道这

如何做到这一点呢?请给我一些指导。我在下面描述我的问题

当我点击主页按钮并从托盘中移除应用程序时,当我打开应用程序时,我会看到登录屏幕。我知道如何很好地使用
NSUserDefaults

但我的问题是,当我导航到第三或第四个
viewController
时,我按下Home按钮并从托盘中移除应用程序,然后每当我打开应用程序时,我都不想用上次打开的
viewController
打开

同样,当我的应用程序崩溃时,我再次打开它,然后我想用上次打开的
viewController
状态打开应用程序

所以我只想知道这有没有可能?如果是,那么请指导我如何实现这一目标


谢谢

我知道您对代码部分没有意见,所以我将给出我的建议

在每个视图控制器的
viewdiload
上,设置导航阵列上最顶端对象的nsuserdefault值


如果它们的分支不太多,那么您可以轻松地管理根视图控制器的推送

,这两种情况都是可能的

在崩溃时,您可以使用UncaughtExceptionHandler执行一些代码。在应用程序委托中,按如下方式注册处理程序:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
//  Other didFinishLaunchingWithOptions code
并将处理程序方法添加到同一个.m文件中

void uncaughtExceptionHandler(NSException *exception)
{
    //  App crashed, save last selected tabbar index to the to the NSUserDefaults
    [[NSUserDefaults standardUserDefaults] setInteger:tabBarController.selectedIndex forKey:@"LastSelectedTabbarIndex"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
当应用程序运行时,要跟踪上次选择的选项卡栏控制器,请使用
UITABBARCONTROLLERDEGATE
,并将新选择的选项卡栏索引保存到
NSUserDefaults
。简短示例:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    NSUInteger tabIndex = [[tabBarController viewControllers] indexOfObject:viewController];

    //  I have newly selected index, now save it to the NSUserDefaults
}
每当tabbar的选定索引发生更改时,此代码将上次选定的tabbar索引保存到
NSUserDefaults

最后,当应用程序启动时(在您的
didfishlaunchingwithoptions
),从
NSUserDefaults
中读取上次保存的tabbar索引,并相应地设置tabbar的选定索引

self.tabBarController.selectedIndex = lastSelectedIndexFromDefaults;
编辑: 如果您还需要恢复
UINavigationController
s控制器堆栈,这是一项相当困难的任务。我给你一个快速的概述,我想到了什么

有两种情况:

  • 您有自定义视图控制器初始值设定项,需要将自定义对象传递给这些控制器-在这种情况下,几乎不可能(在合理的时间内)实现这一点
  • 仅使用
    -init
    -initWithNibName…
    :初始化导航堆栈中的视图控制器。您可以从选项卡的根
    UINavigationController
    枚举控制器,使用
    NSStringFromClass
    获取它们的类名,并将它们保存到
    NSUserDefaults
    。在应用程序启动时,您将反转该过程(使用从
    NSUserDefaults
    读取的名称字符串初始化控制器,使用类似以下内容:
    UIViewController*vc=[[NSClassFromString(@“aa”)alloc]init];

    • 这不是正确的答案,但您可以在启动后将其用于导航视图

      在AppDelegate文件中,使用以下代码:---

      在登录viewController的init方法中添加通知观察员,在通知方法中,如果收到viewController名称的条件,则可以应用。并在启动LoginView控制器时推送到该viewController,如下所示:---


      这可能会帮助您……

      但是当我在navigate Tabbarviewcontroller-->另一个ViewController中时会怎么样呢?thx提供信息,但是您的想法很好,但是我担心如何使用navigaiton+tabbar和两种登录管理和使用方式来管理我的所有应用程序。。?那么如何管理此plus LoginScreen…及其相关会话和用户…?抱歉,我无法再为您提供更多详细帮助:-/可能的解决方案很大程度上取决于您的应用程序体系结构,我希望你们能理解:-)是的,我知道这就是为什么我这么问:)无论如何谢谢你们的努力和帮助…这个答案看起来很合理。看看什么是应用程序-他们有这两个标签栏和导航。选项卡栏:可能的5个vcs将保存显示的最后一个vcs。导航:如果你在向一个联系人写文本的过程中退出应用程序,你将被重启到相同的位置(这是在一个导航控制器里面)。感谢你的回复是好的,但是我担心如何用WaveAdInt+Tabar来管理这个我的所有应用程序,还有两种类型的登录管理和使用……那么如何管理这个plus LoginScreen…及其相关会话和用户呢?Woohh我认为您必须创建一个类(序列化),然后在其中保存所有必要的信息,如帐户类型、选项卡索引、viewcontroller。以用户默认值将其另存为nsdata
      #import "NewSAppDelegate.h"
      #import "NewSViewController.h"
      
      static NewSAppDelegate *globalSelf;
      
      @implementation NewSAppDelegate
      
      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      {
          self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
          // Override point for customization after application launch.
          self.viewController = [[NewSViewController alloc] initWithNibName:@"NewSViewController" bundle:nil];
          self.navController=[[UINavigationController alloc] initWithRootViewController:self.viewController];
          self.window.rootViewController = self.navController;
          [self.window makeKeyAndVisible];
          globalSelf=self;
          NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
      
          return YES;
      }
      
      void uncaughtExceptionHandler(NSException *exception)
      {
          UIViewController *currentVC = globalSelf.navController.visibleViewController;
          [[NSUserDefaults standardUserDefaults] setObject:NSStringFromClass(currentVC.class) forKey:@"lastVC"];
      }
      
      - (void)applicationDidEnterBackground:(UIApplication *)application
      {
          UIViewController *currentVC = self.navController.visibleViewController;
          [[NSUserDefaults standardUserDefaults] setObject:NSStringFromClass(currentVC.class) forKey:@"lastVC"];
      }
      
      - (void)applicationDidBecomeActive:(UIApplication *)application
      {
          [[NSNotificationCenter defaultCenter] postNotificationName:@"appDidBecomeActive" object:nil];
          // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
      }
      
      - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
      {
          self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
          if (self) {
      
              [[NSNotificationCenter defaultCenter] addObserver:self
                                                       selector:@selector(openLastVC)
                                                           name:@"appDidBecomeActive"
                                                         object:nil];
      
              // Custom initialization
          }
          return self;
      }
      
      -(void)openLastVC
      {
          NSLog(@"val ==%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"lastVC"]);
      
          if ([[[NSUserDefaults standardUserDefaults] valueForKey:@"lastVC"] isEqualToString:@"GhachakViewController"]) {
              GhachakViewController *gvc=[[GhachakViewController alloc] initWithNibName:@"GhachakViewController" bundle:nil];
              [self.navigationController pushViewController:gvc animated:NO];
          }
      }