Meilleure pratique pour afficher un écran de connection unique avec des storyboards

J'ai vu des questions similaires ici, mais pas avec une réponse claire. J'ai donc une vue de connection modale avec le formulaire de nom d'user / mot de passe classique, un button de connection Facebook et un button Inscription que je voudrais montrer lorsque l'user démarre l'application pour la toute première fois. D'après ce que j'ai trouvé, il y a deux façons de mettre en œuvre ceci, avec des raccourcis.

  1. Dans didFinishLaunchingWithOptions de AppDelegate, une condition est définie pour vérifier si l'user est connecté. Sinon, rootViewController est défini sur le loginViewController. Après une connection réussie une segue a lieu à la vue principale de l'application. Mon problème avec cette approche est que je ne suis pas sûr de savoir comment réinitialiser le rootViewController à la vue principale. Est-ce possible et comment?

Existe-t-il d'autres façons d'afficher le modal de connection sans définir rootViewController? Ce qui signifie que je garderais le CVR à la vue principale.

  1. dans le controller de la vue principale dans viewDidAppear une vérification conditionnelle si l'user est connecté. Sinon, une connection au loginVC est effectuée. Lorsque l'user se connecte avec succès, il est renvoyé à la vue principale qui a ignoré la vue de connection modale. Le problème avec cette approche est que la vue principale est brièvement montrée, que je préférerais ne pas faire.

  2. D'autres idées? S'il vous plaît laissez-moi savoir quelle est la meilleure pratique quand il s'agit de ce scénario. Merci d'avance,

Après avoir essayé différentes methods, j'ai pu résoudre ce problème avec ceci:

-(void)viewWillAppear:(BOOL)animated { // Check if user is already logged in NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; if ([[prefs objectForKey:@"log"] intValue] == 1) { self.view.hidden = YES; } } -(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; // Check if user is already logged in NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; if ([[prefs objectForKey:@"log"] intValue] == 1) { [self performSegueWithIdentifier:@"homeSeg3" sender:self]; } } -(void)viewDidUnload { self.view.hidden = NO; } 

À mon avis, la meilleure stratégie pour ce genre de choses est un écran de connection qui est déjà présenté sur le controller principal lors du lancement de l'application. Il est rejeté et désalloué après que l'user se connecte. J'ai trouvé que la plupart des solutions suggérées (ainsi que les suggestions ici: Les meilleures pratiques pour l'écran de connection Storyboard, la manipulation des données effacées lors de la déconnection ) ne le font pas élégamment.

Après quelques expériences d'hier, je pense que la meilleure façon de faire est d'utiliser des controllers de vue enfants:

1. Choisissez votre storyboard Main Interface dans Xcode comme vous le feriez normalement (il n'est pas nécessaire d'append quelque chose à votre appDelegate

Interface principale

2. Ajoutez ce qui suit à votre controller de vue principal dans viewDidLoad :

 // If user is not logged in, show login view controller if (!isLoggedIn) { // Instantiate Login View Controller from storyboard UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; UIViewController *loginVC = [mainSB instantiateViewControllerWithIdentifier:@"Login"]; // Set the Login View Controller's frame loginVC.view.frame = self.view.bounds; // Add login screen as a subview and as a child view controller [self.view addSubview:loginVC.view]; [self addChildViewController:loginVC]; [loginVC didMoveToParentViewController:self]; // Maintain a reference to the Login screen so we can dismiss it later _loginVC = loginVC; } 

3. Une fois l'user connecté, informez votre controller principal en utilisant des notifications ou un délégué. Vous pouvez ensuite animer l'écran de connection comme bon vous semble. Ici, j'utilise une animation de dissolution:

 // Animate out the category chooser [UIView animateWithDuration:0.2 animations:^{ // Dissolve the login screen away [_loginVC.view setAlpha:0]; } completion:^(BOOL finished) { // Remove login screen as a child view controller [_loginVC willMoveToParentViewController:nil]; [_loginVC.view removeFromSuperview]; [_loginVC removeFromParentViewController]; // nil out property _loginVC = nil; }]; 

Et c'est tout! De cette façon, le controller de vue principale est toujours le controller de vue racine de votre window, l'écran de connection est désalloué après la connection de l'user et il n'y a pas de scintillement lors de la présentation de l'écran de connection.

Vous pouvez définir rootViewController via AppDelegate en configurant simplement un controller de navigation. Lorsque vous effectuez la vérification, définissez la vue racine des controllers de navigation sur la vue que vous souhaitez afficher à ce moment-là. Je pense que quelque chose comme ça devrait fonctionner si vous ajoutez une instruction if pour ce que vous voulez faire:

 // Override point for customization after application launch. RootViewController *rootController = [[RootViewController alloc] initWithNibName:nil bundle:nil]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootController]; self.window.rootViewController = navigationController;