Domanda

Quando l'utente avvia l'applicazione lo voglio mostrare la stockholm.xib E lo fa qui:

-(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");

}

, ma quando l'utente chiude lo stockholm.xib utilizzando:

[self dismissModalViewControllerAnimated:YES];

dopo l'animazione è fatto, l'applicazione si blocca. e il motivo è, immagino, viewDidAppear chiama due volte e quindi si sta cercando di aprire il file XI ter chiuso di recente.

Ora, come posso chiamare la vista sembra solo una volta? in modo che quando l'utente torna da Stoccolma il viewDidAppear solito essere chiamato? qualsiasi altra soluzione?

Grazie:)

È stato utile?

Soluzione

Si può provare a spostare tutto ciò che la funzionalità del metodo viewDidLoad: al posto del viewDidAppear. Che uno spara una sola volta. A meno che non c'è un motivo per voi di non ...?

EDIT: più codice per mostrare quello che voglio dire nel commento

nel file h:

BOOL firstTime;

nel file .m:

-(void)viewDidLoad {
   NSLog(@"viewDidLoad actually fired");
   //...
   firstTime = YES;
}
-(void)viewDidAppear {
   //...
   if(firstTime){
      //show it
      firstTime = NO;
   }
}

Altri suggerimenti

È possibile utilizzare GCD, anche se la classe ha un campo come ad esempio:

@interface MyClass {
    dispatch_once_t once;
}

@end

@interface MyClass {
    - (void)viewDidAppear:(BOOL)animated {
        dispatch_once(&once, ^{
            // do business
        });
    }
@end

È possibile aggiungere la proprietà come BOOL caricato al tuo viewcontroller, impostarla su false nel viewDidLoad, e quindi rendere il vostro metodo di viewDidAppear come:

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

che funziona per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top