Como posso chamar o ViewDidappear apenas uma vez?
-
20-09-2019 - |
Pergunta
Quando o usuário inicia o aplicativo, eu quero, mostre o Estocol.xib e ele faz aqui:
-(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");
}
Mas quando o usuário fecha o Estocol.xib usando:
[self dismissModalViewControllerAnimated:YES];
Depois que a animação é concluída, o aplicativo trava. E o motivo é que, eu acho, o ViewDidAppear chama duas vezes e, portanto, está tentando abrir o arquivo XIB recentemente fechado.
Agora, como posso chamar a visualização apareceu apenas uma vez? Para que, quando o usuário voltar de Estocolmo, o ViewDidappear não será chamado? Alguma outra solução?
obrigado :)
Solução
Você pode tentar mover toda essa funcionalidade no viewDidLoad:
método em vez do viewDidAppear
. Aquele apenas dispara uma vez. A menos que haja uma razão para você não ...?
Editar: mais código para mostrar o que quero dizer no comentário
No arquivo .h:
BOOL firstTime;
No arquivo .m:
-(void)viewDidLoad {
NSLog(@"viewDidLoad actually fired");
//...
firstTime = YES;
}
-(void)viewDidAppear {
//...
if(firstTime){
//show it
firstTime = NO;
}
}
Outras dicas
Você também pode usar o GCD, se sua classe tiver um campo como:
@interface MyClass {
dispatch_once_t once;
}
@end
@interface MyClass {
- (void)viewDidAppear:(BOOL)animated {
dispatch_once(&once, ^{
// do business
});
}
@end
Você pode adicionar a propriedade como o bool carregado ao seu ViewController, configurá -la como false no ViewDidload e, em seguida, faça seu método ViewDidAppear como:
- (void)viewDidAppear:(BOOL)animated {
if (!loaded) {
//code
} else {
return;
}
loaded = YES;
}
Isso funciona para mim.