Changement de vue de la racine contrôleur après l'application iOS a chargé.

Afin de montrer mon écran de connexion lors de l'application des charges, et non pas après que l'utilisateur se connecte, j'ai décidé d'ajouter un objet auth dans NSUserDefaults lorsque l'utilisateur se connecte avec succès. Lorsque l'application est lancée, celle-auth paramètre est coché, et la vue-contrôleur est configuré en conséquence (si l'utilisateur est auth il va montrer un flux, si non il va montrer un écran de connexion) Dans ce dernier cas, j'ai l'app délégué réinitialiser la vue racine contrôleur de l'alimentation après que l'utilisateur a ouvert une session. Est-ce une mauvaise pratique ou est-il une meilleure manière de faire ceci?

Dans le délégué d'application:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary     *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    IIViewDeckController* deckController = [self generateControllerStack];
    self.rightController = deckController.rightController;
    self.centerController = deckController.centerController;

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if([[defaults objectForKey:@"auth"] isEqualToNumber:[NSNumber numberWithInt:1]]){
        self.window.rootViewController = deckController;
    }else{
        UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                 bundle:nil];
        UIViewController* vc = [sb instantiateViewControllerWithIdentifier:@"loginViewController"];
        self.window.rootViewController = vc;
    }
    [self.window makeKeyAndVisible];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO];
    return YES;
}

- (void) setRoots
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    IIViewDeckController* deckController = [self generateControllerStack];
    self.rightController = deckController.rightController;
    self.centerController = deckController.centerController;
    self.window.rootViewController = deckController;
    [self.window makeKeyAndVisible];
}

Dans le de connexion view controller:

- (IBAction)loginClick:(id)sender {
    if([_emailField.text length]>0&&[_passField.text length]>0){
        NSString *user = _emailField.text;
        NSString *pass = _passField.text;
        [[API sharedInstance] login:user andPass:pass onCompletion:^(NSDictionary *json){
            NSLog(@"%@", json);
            if(![json objectForKey:@"error"]){
                [API sharedInstance].authorized = 1;
                NSNumber *auth = [NSNumber numberWithInt:1];
                NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
                [defaults setObject:auth forKey:@"auth"];
                [defaults synchronize];

                captureYouAppDelegate *app = [[UIApplication sharedApplication] delegate];
                [app setRoots]; 
            }else{
                [API sharedInstance].authorized = 0;
            }
        }];
    }else{
        if([_emailField.text length]<1){
            [_emailField becomeFirstResponder];
        }else{
            [_passField becomeFirstResponder];
        }
    }
}

Je me demandais si il est mieux ou plus facile façon de le faire. Merci!!!!

pourquoi ne pas ajouter un simple UINavigationController comme rootViewController, et que vous ne poussez pas l'écran de connexion dans la pile de navigation si l'utilisateur est déjà connecté. il serait beaucoup plus facile et beaucoup plus élégante que votre solution actuelle est.
Si la barre d'onglets est également nécessaire après la connexion, l'ajout d'un UINavigationController ne serait pas une option, un droit?

OriginalL'auteur Misbah Khan | 2013-08-14