2010-02-14 17 views
7

Cuando el usuario inicia la aplicación que quiero que se muestre la stockholm.xib y lo hace aquí:¿Cómo puedo llamar al ViewDidAppear solo una vez?

-(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 la stockholm.xib usando:

[self dismissModalViewControllerAnimated:YES]; 

después de la animación es hecho, la aplicación falla. y la razón es que, supongo, viewDidAppear llama dos veces y, por lo tanto, está intentando abrir el archivo xib cerrado recientemente.

ahora, ¿Puedo llamar a la vista apareció una sola vez? para que cuando el usuario regrese de Estocolmo no se llame a viewDidAppear? cualquier otra solución?

Gracias :)

Respuesta

14

Usted puede tratar de mover toda esa funcionalidad en el método viewDidLoad: en lugar de la viewDidAppear. Ese solo dispara una vez. A menos que haya una razón para que usted no ...

EDIT: 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; 
    } 
} 
+0

sí, la razón es que si muevo esto: Stockholm * Start = [[Stockholm alloc] initWithNibName: nil bundle: nil]; [self presentModalViewController: Inicio animado: SÍ]; para viewdidLoad, no funcionará. – hafhadg3

+1

Si solo quiere mostrarlo la primera vez que aparece la vista, simplemente use un indicador booleano para saber si es la primera vez o no. BOOL firstTime = verdadero; if (... && firstTime) {firstTime = falso; ...} – Dimitris

+0

Todavía no funciona. .h estática BOOL firstTime = TRUE; .m - (void) viewDidAppear: (BOOL) animado { \t [super viewDidAppear: animation]; \t si (firstTime = true) {// \t \t Ir a la Página personalizada \t} \t firstTime = false; } consigo este error: 0x018ce464 <+0665> JNE 0x18ce481 <- [UIWindowController transitionViewDidComplete: fromView: toView:] + 694> Por favor, ayuda! – hafhadg3

6

Usted puede usar GCD También, 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 
+2

EDIT: todavía necesita la bandera. Usar un método estático significaría que el código se ejecutará solo una vez, sin importar cuántas instancias del controlador de vista se crearon. – ZaBlanc

+0

Esto parece una buena idea, pero en realidad dará como resultado un comportamiento indefinido: 'El predicado debe apuntar a una variable almacenada en el alcance global o estático. El resultado de utilizar un predicado con almacenamiento automático o dinámico no está definido. – datwelk

1

Puede añadir la propiedad como BOOL cargado a su viewcontroller, establecido en false en el viewDidLoad, y luego hacer que su método viewDidAppear como:

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

que funciona para mí.

Cuestiones relacionadas