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 :)

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top