iphone - iOS : is it possible to open previous viewController after crashing and re-launch app?

标签 iphone ios objective-c

如何实现下面的这些东西?请给我一些指导。我在下面描述了我的问题。

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

但我的问题是,当我导航到第 3 个或第 4 个 viewController 并按下主页按钮并从托盘中删除应用程序时,每当我打开应用程序时,我想用上次打开的 viewController 打开

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

所以我只想知道这是否可能?如果是,请指导我如何实现这些东西。

谢谢

最佳答案

,这两种情况都是可能的。

崩溃时,您可以使用 UncaughtExceptionHandler 来执行一些代码。在您的应用委托(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];
}

在应用程序运行时,要跟踪最后选择的标签栏 Controller ,请使用 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
}

每次 tabbar 的选定索引更改时,此代码会将最后选定的 tabbar 的索引保存到 NSUserDefaults

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

self.tabBarController.selectedIndex = lastSelectedIndexFromDefaults;

编辑: 如果您还需要恢复 UINavigationController 的 Controller 堆栈,这是一项非常困难的任务。我只是简要概述一下我的想法。

有2种情况:

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

关于iphone - iOS : is it possible to open previous viewController after crashing and re-launch app?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17066537/

相关文章:

iOS 中的 Android 基本名称值对列表

ios - 将 NSString 转换为 NSDictionary

iOS - 自定义表格单元格不是 UITableView 的全宽

iphone - UItextfield 删除文本

ios - Xcode:进程启动失败 - 安全

ios - 如何识别 iOS 中的混​​合层?

ios - 如何正确清理 AVCaptureSession 和 AVCaptureVideoPreviewLayer

ios - 无法关闭通过单击 UITextVIew 中的邮件链接显示的 MFMailComposeViewController(iOS 8 测试版错误)

ios - 模仿 UIAlertView 反弹?

iphone - 如何将多个项目合并为一个项目