Come posso chiamare l'viewDidAppear una sola volta?
-
20-09-2019 - |
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:)
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.