2012-04-05 2 views
12

Dans mon storyboard, j'ai une vue sous forme d'écran de démarrage. Dans cette vue, j'ai déjà un bouton comme "Open Application" qui ouvre la vue du menu avec une section modale. Mais je veux aussi que l'écran exécute segue automatiquement, comme après l'affichage de 2 secondes.Comment effectuer une segmentation avec retard

Certains code ici:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [self performSegueWithIdentifier:@"splashScreenSegue" sender:self]; 
} 

Comme vous pouvez le voir, je l'ai déjà utiliser performSegueWithIdentifier mais il effectue immédiatement. Y a-t-il une méthode pour le retarder?

Merci d'avance.

Répondre

25

Vous pouvez utiliser dispatch_after de GCD pour exécuter votre code Segue 2 secondes après le point de vue apparaît, e.x:

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

    double delayInSeconds = 2.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [self performSegueWithIdentifier:@"splashScreenSegue" sender:self]; 
    }); 
} 

En outre, s'il vous plaît assurez-vous que vous vous souvenez d'appeler la super mise en œuvre lors de la substitution des méthodes du cycle de vie de UIViewController.

+0

hmm très facile, hein? pas de surprise ^^ ce code me confondait: [self performSelector: @selector (showSplash) avecObject: nil afterDelay: SPLASH_HIDE_DELAY]; Je me demandais s'il y avait un moyen semblable pour les segues. Merci. – kubilay

5

Je pense qu'il existe une meilleure approche qui permet au contrôleur lui-même de gérer les problèmes de répartition. Vous pouvez y arriver comme ceci:
d'abord créer une méthode comme celle qui plus tard, vous utiliserez le sélecteur

- (void)showAnotherViewController{ 
    [self performSegueWithIdentifier:@"yourSegueToAnotherViewController" sender:self]; 
} 

Puis, quand vous voulez afficher une autre vue utilisation du contrôleur cette ligne de code dans votre contrôleur de vue actuel:

[self performSelector:@selector(showAnotherViewController) withObject:nil afterDelay:yourDelayInSeconds];