59 votes

Effectuer Segue sur ViewDidLoad

Dans iOS 5, j'ai un Storyboard avec un contrôleur de vue modal, que je voudrais afficher si c'est la première fois que l'utilisateur l'utilise dans l'application, puis je voudrais ignorer ce contrôleur de vue.

J'ai défini une clé NSDefault pour gérer cela, mais lorsque je vérifie si cela est défini, puis que j'utilise performSegueWithIdentifier pour lancer la séquence, rien ne se produit. Si je mets cette séquence derrière un bouton cela fonctionne très bien ...

50voto

Scott Sherwood Points 2516

J'ai répondu à une question similaire, où le développeur a voulu montrer un écran de connexion au début. J'ai mis en place un exemple de code pour lui, cela peut être téléchargée ici. La clé pour résoudre ce problème est d'appeler les choses au bon moment, si vous souhaitez afficher cette nouvelle view controller, vous verrez dans l'exemple, vous devez utiliser quelque chose comme ceci

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
    [vc setModalPresentationStyle:UIModalPresentationFullScreen];

    [self presentModalViewController:vc animated:YES];
}

J'ai aussi une explication de la façon dont enchaîne et des story-boards de travail que vous pouvez le voir ici

43voto

bearMountain Points 1305

Le chargement dans ViewDidLoad a provoqué le clignotement de "sous-couche". J'ai résolu ce problème en chargeant mon Storyboard par programmation. Ainsi, sous Cible / Scénario principal - laissez ce champ vide. Puis ajoutez ce qui suit:

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

    // Load Main App Screen
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    HomeScreenVC *homeScreenVC = [storyboard instantiateInitialViewController];
    self.window.rootViewController = homeScreenVC;
    [self.window makeKeyAndVisible];

    // Load Login/Signup View Controller
    UIViewController *mainLoginVC = [storyboard instantiateViewControllerWithIdentifier:@"MainLoginVC"];
    [mainLoginVC setModalPresentationStyle:UIModalPresentationFullScreen];
    [homeScreenVC presentModalViewController:mainLoginVC animated:NO];

    return YES;
}
 

23voto

NJones Points 20265

Le problème est que vous ajoutez une deuxième vue à la hiérarchie avant que la première ne soit complètement ajoutée. Essayez de mettre votre code dans:

 -(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    // Present your modal from here
}
 

Après l'appel de [super viewDidAppear] vous devez modifier une vue entièrement chargée.

12voto

ThePugson Points 131

Il n'y a aucun problème principal avec l'exécution enchaîne dans le viewDidLoad (après l'appel à super bien sûr).

Le problème consiste à effectuer enchaîne avant que la fenêtre de l'application est rendue visible. Le UIViewController vous souhaitez afficher est partie du storyboard afin qu'il soit chargé en mémoire avant que l'application commence l'exécution de son code dans l'application délégué. Dans votre cas, le viewDidLoad est appelé par iOS avant de votre fenêtre d'application reçu de message: MakeKeyAndVisible.

L'important, c'est la visibilité. L'exécution d'une séquence sur une vue de la hiérarchie dans laquelle la fenêtre n'est pas visible ne fait rien!

Vous pouvez essayer de faire quelque chose comme ceci:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// The window initialized with hidden = YES, so in order to perform the segue we need to set this value to NO.
// After this action, the OS will add the window.rootViewController's view as a subview of the window.
self.window.hidden = NO;

[self.window.rootViewController performSegueWithIdentifier:_IDENTIFIER_ sender:self.window.rootViewController];

// Now that the window is not hidden, we must make it key.
[self.window makeKeyWindow];
return YES;
}

10voto

Leonty Deriglazov Points 638

Une bonne façon de résoudre votre problème est de déclencher la séquence / présent modal-vue-contrôleur en applicationDidBecomeActive: délégué d'application de la méthode ou dans un UIApplicationDidBecomeActiveNotification de la notification du gestionnaire.

La documentation d'Apple fait conseille la même:

Si votre application a été précédemment dans le fond, vous pouvez également l'utiliser pour actualiser votre application d'interface utilisateur.

Cette solution a l'avantage que cela fonctionne avec les Principaux storyboard mécanisme de chargement de sorte que vous n'avez pas besoin de charger tout manuellement et à écrire de code inutile.

J'utilise cette solution avec succès sur iOS 6.1, 7.0 et 7.1 et il devrait fonctionner sur iOS 5.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X