2017-08-29 1 views
1

J'ai un StartViewController avec un Segue mis en place un FinishViewController.Erreur lors de tentative de présenter ViewController sur CLICK mais pas la méthode feu

Le StartViewController a un bouton et minuterie. Si la minuterie est épuisée, elle appelle la méthode finish. Mais l'utilisateur peut cliquer sur le bouton stop pour passer au FinishViewController; Si l'utilisateur clique sur le bouton stop, FinishViewController est chargé.

Si la minuterie appelle la méthode finish je reçois l'erreur:

Warning: Attempt to present < FinishViewController: 0x7c15a1d0> on < StartViewController: 0x7c252d20> whose view is not in the window hierarchy!

Je ne comprends pas pourquoi. Le code est littéralement le même.

Voici le code.

- (IBAction)stop:(id)sender { 
    [timer invalidate]; 
    timer = nil; 

    [self performSegueWithIdentifier:@"segue_finished" sender:self]; 
} 

- (void) finish { 

    [timer invalidate]; 
    timer = nil; 

    [self performSegueWithIdentifier:@"segue_finished" sender:self]; 
} 

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    NSLog(@"prepareForSegue %@", [segue identifier]); 

    if ([[segue identifier] isEqualToString:@"segue_finished"]) { 
     NSLog(@"segue to finished. "); 
     FinishViewController * fvc = (FinishViewController*)segue.destinationViewController; 

    } 

} 

Une aide?

+0

Il semble que votre méthode 'finish' soit appelée lorsque votre StartViewController n'est pas affiché. – algrid

Répondre

1

Où avez-vous ajoutez votre minuterie? Vous devez l'ajouter dans viewDidAppear dans StartViewController et l'invalider dans viewWillDissapear. Et ne pas oublier de courir dans performSegue thread principal:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self performSegueWithIdentifier:@"segue_finished" sender:self]; 
}); 
0

i avait même cette question quand je présentais accidentellement le même contrôleur de vue deux fois.

Vérifiez qu'il ne remet pas la fonction (arrêt) quand arrêter le chronomètre.