iphone - porque - ¿Cómo puedo llamar a ViewDidAppear solo una vez?
no puedo fusionar llamadas iphone (3)
Puede intentar mover toda esa funcionalidad en el método viewDidLoad:
lugar de viewDidAppear
. Ese solo dispara una vez. A menos que haya una razón para que usted no ...
EDITAR: más código para mostrar lo que quiero decir en el comentario
en el archivo .h:
BOOL firstTime;
en el archivo .m:
-(void)viewDidLoad {
NSLog(@"viewDidLoad actually fired");
//...
firstTime = YES;
}
-(void)viewDidAppear {
//...
if(firstTime){
//show it
firstTime = NO;
}
}
Cuando el usuario inicie la aplicación, quiero que muestre el archivo stockholm.xib y lo haga aquí:
-(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");
}
pero cuando el usuario cierra stockholm.xib usando:
[self dismissModalViewControllerAnimated:YES];
después de que finalice la animación, la aplicación se bloquea. y la razón es que, supongo, viewDidAppear llama dos veces y, por lo tanto, está intentando abrir el archivo xib cerrado recientemente.
ahora, ¿cómo puedo llamar a la vista apareció solo una vez? para que cuando el usuario regrese de Estocolmo no se llame a viewDidAppear? cualquier otra solución?
gracias :)
También puede usar GCD si su clase tiene un campo como:
@interface MyClass {
dispatch_once_t once;
}
@end
@interface MyClass {
- (void)viewDidAppear:(BOOL)animated {
dispatch_once(&once, ^{
// do business
});
}
@end
Puede agregar la propiedad como BOOL cargada a su viewcontroller, establecerla en false en viewdidload y luego hacer su método viewDidAppear como:
- (void)viewDidAppear:(BOOL)animated {
if (!loaded) {
//code
} else {
return;
}
loaded = YES;
}
Funciona para mi.