Comment puis-je appeler le ViewDidAppear qu'une seule fois?
-
20-09-2019 - |
Question
Lorsque l'utilisateur démarre l'application que je veux montrer la stockholm.xib et il fait ici:
-(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 se fait, les accidents de l'application. et la raison en est, je suppose, viewDidAppear appelle deux fois et il est donc d'essayer d'ouvrir le fichier récemment fermé xib.
maintenant, comment puis-je appeler la vue ne semble qu'une seule fois? de sorte que lorsque l'utilisateur revient de Stockholm le viewDidAppear appelé coutume? toute autre solution?
Thanx:)
La solution
Vous pouvez essayer de déplacer toutes ces fonctions dans la méthode viewDidLoad:
au lieu du viewDidAppear
. Que l'on tire une seule fois. À moins qu'il y ait une raison pour vous de ne pas ...?
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;
}
}
Autres conseils
Vous pouvez utiliser GCD, aussi, si votre classe a un domaine tel que:
@interface MyClass {
dispatch_once_t once;
}
@end
@interface MyClass {
- (void)viewDidAppear:(BOOL)animated {
dispatch_once(&once, ^{
// do business
});
}
@end
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;
}
Cela fonctionne pour moi.