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

时间:2013-06-12 13:15:34

标签: iphone ios objective-c

如何实现以下这些内容?请给我一些指导。我在下面描述我的问题。

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

但我的问题是,当我导航第3或第4 viewController时,我按下主页按钮并从托盘中删除应用程序,然后每当我打开应用程序时,我想打开最后一次打开viewController。< / p>

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

所以我只是想知道那可能与否?如果是,那么请指导我如何实现这些目标。

谢谢

3 个答案:

答案 0 :(得分:3)

,两种情况都是可能的。

崩溃,您可以使用UncaughtExceptionHandler来执行某些代码。在你的app delegate中,注册你这样的处理程序:

- (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];
}

在应用运行时,要跟踪上次选择的标签栏控制器,请使用UITabBarControllerDelegate并将新选择的标签栏索引保存到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
}

每次标签栏选定的索引更改时,此代码会将上次选中的标签栏索引保存到NSUserDefaults

最后,当您的应用开始时(在didFinishLaunchingWithOptions中),请从NSUserDefaults读取上次保存的标签栏索引并相应地设置标签栏的所选索引

self.tabBarController.selectedIndex = lastSelectedIndexFromDefaults;

修改 如果你还需要恢复UINavigationController的控制器堆栈,那么它的任务非常困难。我简要介绍一下我的想法。

有两种情况:

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

答案 1 :(得分:2)

我知道您对代码部分没问题,所以我只是提出我的建议

在每个视图控制器的viewDidLoad上设置导航阵列上最顶层对象的nsuserdefault值。

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

答案 2 :(得分:2)

这不是正确的答案,但您可以在启动后使用它来导航视图。

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

#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.
}

在你的登录viewController的init方法中添加一个观察者来通知,并且在通知方法中,你可以在收到viewController名字的条件时申请。并在启动LoginView控制器时推送到那个viewController:---

- (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];
    }
}

这可以帮助你......