Afficher le mot de passe / Pincode lors du lancement de l'application – Storyboard

J'essaie d'afficher un code d'access / code PIN (controller de vue modale) lors du lancement de l'application. Vous pouvez voir le code dans AppDelegate.h:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (![[NSUserDefaults standardUserDefaults] boolForKey:@"passcode_in"]) { //display passcode screen UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"PasscodeViewController"]; [vc setModalPresentationStyle:UIModalPresentationFullScreen]; [self presentModalViewController:vc animated:NO]; } else { NSLog(@"No Passcode Screen"); } return YES; } 

Le problème est que AppDelegate ne prend pas en charge l'affichage d'un controller de vue modale (presentModalViewController). Je ne vais pas utiliser les files .xib, seulement Storyboard pour mon application. Est-ce que quelqu'un sait ce qui ne va pas? Toute suggestion appréciée.

RÉSOLU

J'ai suivi l'instruction donnée à l'une de mes questions postées précédemment https://stackoverflow.com/a/10303870/1344459 J'ai résolu le problème en ajoutant seulement du code dans deux methods applicationDidEnterBackground et applicationWillTerminate dans AppDelegate.m pour PinCodeViewController (modal) sur lancement de l'application. Maintenant, cela fonctionne si bien.

Ma solution au même problème était de créer un autre controller de vue dans le storyboard, de le lier à mon controller de vue initial via une séquence personnalisée, et d'appeler le segue dans la méthode viewDidLoad du ViewController. LoginSegue.h

 #import <UIKit/UIKit.h> @interface LoginSegue : UIStoryboardSegue @end 

LoginSegue.m

  #import "LoginSegue.h" @implementation LoginSegue - (void)perform { UIViewController *src = (UIViewController *) self.sourceViewController; UIViewController *dst = (UIViewController *) self.destinationViewController; [UIView transitionWithView:src.navigationController.view duration:0.0 options:UIViewAnimationTransitionNone animations:^{ [src.navigationController presentViewController:dst animated:NO completion:nil]; } completion:NULL]; } @end 

Ensuite, dans le storyboard, select votre segue et réglez la class de segue sur LoginSegue et l'identifiant sur ce que vous voulez. Le mien est @ "toLogin". Et inclure les éléments suivants dans votre viewDidLoad:

 [self performSegueWithIdentifier:@"toLogin" sender:self]; 

presentModalViewController est une méthode de la class UIViewController . Votre AppDelegate est un NSObject ou UIResponder donc ne le reconnaîtra pas.

Vous devez présenter votre code d'access / code secret de façon non modale, en le plaçant dans le premier UIViewController de votre Storyboard.

Si vous avez besoin de l'afficher de manière modale, même si ce n'est pas nécessaire, présentez votre vue modale depuis le premier UIViewController de votre Storyboard et non depuis AppDelegate.

Dans votre UIViewController vous devriez écrire quelque chose comme ceci:

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"PasscodeViewController"]; [vc setModalPresentationStyle:UIModalPresentationFullScreen]; [self performSelector:@selector(presentModal) withObject:nil afterDelay:0.0]; } - (void)presentModal { [self presentViewController:vc animated:NO completion:NULL]; } 

NB Vous avez besoin de performSelector . Si vous ne l'utilisez pas, votre vue ne sera pas affichée. S'il vous plaît, notez que presentModalViewController est maintenant obsolète, utilisez plutôt presentViewController .

Si le mot de passe est une condition préalable à la connection, il peut être judicieux de l'intégrer au path de connection.

Pour cela dans le storyboard, peignez un controller de navigation, supprimez la racine UITableViewController que vous obtenez par défaut et configurez votre PasscodeViewController en tant que racine. Ensuite, ajoutez un segue push à partir de là au LoginViewController.

La logique dans PasscodeViewController est similaire à ce qui a été discuté ici: Sur viewWillAppear: il peut vérifier si une exigence de code d'access est remplie ou non. Si c'est nécessaire, laissez la vue du code d'access apparaître et faites son travail. Si vous avez déjà le code d'access, effectuez la connection au LoginViewController. Si aucun n'est nécessaire, rejeter.

Enfin, une fois le mot de passe collecté par PasscodeViewController, il peut décider d'exiger ou non l'ouverture d'une session (effectuer une connection à LoginViewController), ou simplement lancer l'application (ignorer).

J'espère que c'est utile.