はい、どちらの場合も可能です。
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;
編集: sコントローラースタック
も復元する必要がある場合UINavigationController
、それはかなり難しい作業です。頭に浮かんだことを簡単に紹介します。
2 つのケースがあります。
- カスタム ビュー コントローラーの初期化子があり、それらのコントローラーにカスタム オブジェクトを渡す必要があります。
-init
または:のみを使用-initWithNibName...
して、ナビゲーション スタックのビュー コントローラーを初期化します。UINavigationController
タブのルートからコントローラーを列挙し、それらのクラス名を使用して取得しNSStringFromClass
、NSUserDefaults
. アプリの起動時に、手順を逆にします (NSUserDefaults
次のようなものを使用して読み取った名前文字列を使用してコントローラーを初期化しますUIViewController *vc = [[NSClassFromString(@"aa") alloc] init];
)。