7

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

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

但我的问题是,当我导航第 3 或第 4 时viewController,我按下 Home 按钮并从托盘中删除应用程序,然后每当我打开应用程序时,我想用 last open 打开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;

编辑: 如果您还需要恢复UINavigationControllers 控制器堆栈,这是一项非常艰巨的任务。我给你一个快速的概述,我想到了什么。

有2种情况:

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

我知道你对代码部分没意见,所以我只会给出我的建议

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

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

于 2013-06-12T13:24:02.293 回答
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 回答