user1839995
user1839995

Reputation: 113

NSUserDefaults remember view

My App contains a couple of views, I would like to display a small setup when the app launches and the user didn't complete the wizard yet. I know I can achieve this with NSUserDefaults, But I'm unsure how I can make it to display a specific view depending on the input string of the NSUserDefaults storage.

My AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    NSString *controllerName = [[NSUserDefaults standardUserDefaults] objectForKey:@"WIZARD_VIEW"];
    if ([controllerName length]) {
        Class controllerClass = NSClassFromString(controllerName);
        UIViewController *controller = [[controllerClass alloc] init];

    // Override point for customization after application launch.
    return YES;
    }

Then in the viewcontroller files I added the following code as suggestion from jfaller:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSUserDefaults* standard=[NSUserDefaults standardUserDefaults];
    [standard registerDefaults: @{ @"WIZARD_VIEW" : [[self class]description]} ];    [[NSUserDefaults standardUserDefaults] synchronize];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSUserDefaults* standard=[NSUserDefaults standardUserDefaults];
    [standard registerDefaults: @{ @"WIZARD_VIEW" : [[self class]description]} ];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

But how can I make this so it will display the specific view that has been selected in the setup?

Upvotes: 2

Views: 264

Answers (2)

jfaller
jfaller

Reputation: 508

Personally, I would do the following:

Every time a user goes to a new view in your wizard, record the UIViewController in the user defaults:

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  [[NSUserDefaults standardUserDefaults] setObject:[[self class] description] forKey:WIZARD_VIEW];
  [[NSUserDefault standardUserDefaults] synchronize];
}

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  [[NSUserDefaults standardUserDefaults] removeObjectForKey:WIZARD_VIEW];
  [[NSUserDefault standardUserDefaults] synchronize];
}

When the user restarts the app (hypothetically in the middle of the wizard), reload the view:

- (BOOL)application:(UIApplication *)application
    willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // etc.
  NSString *controllerName = [[NSUserDefaults standardUserDefaults] objectForKey:WIZARD_VIEW];
  if ([controllerName length]) {
    Class controllerClass = NSClassFromString(controllerName); 
    NSViewController *controller = [[controllerClass alloc] init];
    // push the controller, or whatever....
  }
  // etc.
}

Upvotes: 3

Jack Humphries
Jack Humphries

Reputation: 13267

Write the view you are on to NSUserDefaults as the view loads. Then check for the value in didFinishLaunchingWithOptions.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([[[NSUserDefaults standardUserDefaults] valueForKey:@"current_setup"] isEqualToString:@"1"]) {

         //on view 1!   

    }

}

Upvotes: 1

Related Questions