是的,这两种情况都是可能的。
在 crash 时,您可以使用 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];
}
在应用程序运行时,要跟踪上次选择的标签栏控制器,请使用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
s 控制器堆栈,这是一项非常艰巨的任务。我给你一个快速的概述,我想到了什么。
有2种情况:
- 您有自定义视图控制器初始化程序并且需要将自定义对象传递给这些控制器 - 在这种情况下,它几乎不可能(在一些合理的时间内)实现这个
- 您仅使用
-init
or -initWithNibName...
: 来初始化导航堆栈中的视图控制器。您可以从选项卡的根目录枚举控制器UINavigationController
,使用获取它们的类名NSStringFromClass
并将它们保存到NSUserDefaults
. NSUserDefaults
在应用程序启动时,您将反转过程(使用从使用以下内容读取的名称字符串初始化控制器:)UIViewController *vc = [[NSClassFromString(@"aa") alloc] init];
。