2010-02-14 18 views
7

Lorsque l'utilisateur démarre l'application que je veux montrer la stockholm.xib et il fait ici:Comment puis-je appeler le ViewDidAppear une seule fois?

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

    NSUserDefaults *startPage =[NSUserDefaults standardUserDefaults]; 
    NSString *page =[startPage stringForKey:@"page"]; 
    NSLog(page); 

    if(page==nil) 
    { 
     //Do nothing 

    } 
    else if ([page isEqualToString:@"Default"]) 
    { 
     //Do nothing 
    } 

    else if ([page isEqualToString:@"Stockholm"]) 
    { 
     NSLog(@"going to Stockholm"); 
     Stockholm *Start =[[Stockholm alloc]initWithNibName:nil bundle:nil]; 
     [self presentModalViewController:Start animated:YES]; 


    } 
    else { 
     NSLog(@"HAHA"); 

} 

mais lorsque l'utilisateur ferme la stockholm.xib en utilisant:

[self dismissModalViewControllerAnimated:YES]; 

après l'animation est fait, l'application se bloque. et la raison en est, je suppose, viewDidAppear appelle deux fois et par conséquent il essaie d'ouvrir le fichier xib récemment fermé.

maintenant, comment puis-je appeler la vue est apparue qu'une seule fois? de sorte que lorsque l'utilisateur revient de Stockholm, viewDidAppear ne sera pas appelé? toute autre solution?

:) Thanx

Répondre

14

Vous pouvez essayer de déplacer tout ce que la fonctionnalité dans la méthode viewDidLoad: au lieu du viewDidAppear. Celui-là ne tire qu'une fois. A moins qu'il y ait une raison pour que tu ne ...?

EDIT: plus de code pour montrer ce que je veux dire dans le commentaire

dans le fichier .h:

BOOL firstTime; 

dans le fichier .m:

-(void)viewDidLoad { 
    NSLog(@"viewDidLoad actually fired"); 
    //... 
    firstTime = YES; 
} 
-(void)viewDidAppear { 
    //... 
    if(firstTime){ 
     //show it 
     firstTime = NO; 
    } 
} 
+0

Oui, la raison en est que si je déplace ceci: Stockholm * Start = [[Stockholm alloc] initWithNibName: nil bundle: nil]; [self presentModalViewController: Démarrer l'animation: YES]; à viewdidLoad, cela ne fonctionnera pas. – hafhadg3

+1

Si vous voulez seulement l'afficher la première fois que la vue apparaît, utilisez simplement un drapeau booléen pour dire si c'est la première fois ou non. BOOL firstTime = true; if (... && firstTime) {firstTime = false; ...} – Dimitris

+0

Ça ne marche toujours pas. .h static BOOL firstTime = VRAI; .m - (vide) viewDidAppear: (BOOL) animé { \t [super viewDidAppear: animé]; \t si (firstTime = TRUE) {// \t \t Aller à la page personnalisée \t} \t firstTime = false; } i obtenir cette erreur: 0x018ce464 <+0665> jne 0x18ce481 <- [UIWindowController transitionViewDidComplete: fromView: toView:] + 694> s'il vous plaît HELP! – hafhadg3

6

Vous pouvez utiliser GCD aussi, si votre classe a un champ tel que:

@interface MyClass { 
    dispatch_once_t once; 
} 

@end 

@interface MyClass { 
    - (void)viewDidAppear:(BOOL)animated { 
     dispatch_once(&once, ^{ 
      // do business 
     }); 
    } 
@end 
+2

EDIT: Toujours besoin du drapeau. L'utilisation d'une méthode statique signifierait que le code ne s'exécuterait qu'une seule fois, quel que soit le nombre d'instances du contrôleur de vue créées. – ZaBlanc

+0

Cela semble être une bonne idée, mais cela entraînera un comportement non défini: 'Le prédicat doit pointer vers une variable stockée dans une portée globale ou statique. Le résultat de l'utilisation d'un prédicat avec stockage automatique ou dynamique est indéfini. » – datwelk

1

Vous pouvez ajouter la propriété comme BOOL chargé à votre viewcontroller, mettre à false dans le viewDidLoad, puis faites votre méthode viewDidAppear comme:

- (void)viewDidAppear:(BOOL)animated { 
    if (!loaded) { 
     //code 
    } else { 
     return; 
    } 
    loaded = YES; 
} 

qui fonctionne pour moi.