7

以下でこれを達成する方法は?そのためのガイダンスをお願いします。私の問題を以下に説明します。

ホームボタンをタップしてトレイからアプリを削除すると、アプリを開いているときにログイン画面が表示されます。使い方がNSUserDefaultsよくわかりました。

しかし、私の問題は、3番目または4番目にナビゲートしてviewControllerホームボタンを押してトレイからアプリを削除すると、最後に開いたものよりもアプリを開くたびに開くことですviewController

アプリがクラッシュしていて、もう一度開いているときも同じで、最後に開いた状態でアプリを開きたいですviewController

だから私はそれが可能かどうか知りたいだけですか?はいの場合、これを達成する方法を教えてください。

ありがとうございました

4

3 に答える 3

3

はい、どちらの場合も可能です。

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タブのルートからコントローラーを列挙し、それらのクラス名を使用して取得しNSStringFromClassNSUserDefaults. アプリの起動時に、手順を逆にします (NSUserDefaults次のようなものを使用して読み取った名前文字列を使用してコントローラーを初期化しますUIViewController *vc = [[NSClassFromString(@"aa") alloc] init];)。
于 2013-06-12T13:39:48.090 に答える
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];
    }
}

これがあなたを助けますように....

于 2013-06-12T14:12:57.410 に答える