Wie kann ich die ViewDidAppear nur einmal anrufen?
-
20-09-2019 - |
Frage
Wenn der Benutzer die App starten ich will es zeigen die stockholm.xib und es tut sich hier:
-(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");
}
aber, wenn der Benutzer schließt die stockholm.xib mit:
[self dismissModalViewControllerAnimated:YES];
, nachdem die Animation fertig ist, stürzt die App. und der Grund ist, ich denke, viewDidAppear ruft zweimal und es deshalb versucht, die vor kurzem geschlossene xib Datei zu öffnen.
jetzt, wie kann ich nennen die Ansicht nur ein einziges Mal erscheinen? so dass, wenn der Benutzer aus Stockholm kommt wieder die viewDidAppear werde nicht genannt werden? eine andere Lösung?
Danke:)
Lösung
Sie können versuchen, alle diese Funktionalität in der viewDidLoad:
Verfahren bewegt anstelle des viewDidAppear
. Dass man feuert nur einmal. Es sei denn, es gibt einen Grund für Sie nicht ...?
EDIT: mehr Code zu zeigen, was ich in dem Kommentar
bedeutenin der H-Datei:
BOOL firstTime;
in der .m-Datei:
-(void)viewDidLoad {
NSLog(@"viewDidLoad actually fired");
//...
firstTime = YES;
}
-(void)viewDidAppear {
//...
if(firstTime){
//show it
firstTime = NO;
}
}
Andere Tipps
Sie können GCD nutzen, auch wenn Sie Ihre Klasse hat ein Feld, wie zum Beispiel:
@interface MyClass {
dispatch_once_t once;
}
@end
@interface MyClass {
- (void)viewDidAppear:(BOOL)animated {
dispatch_once(&once, ^{
// do business
});
}
@end
Sie können die Eigenschaft hinzufügen wie BOOL zu Ihrem Viewcontroller geladen, stellen Sie ihn auf false im viewDidLoad, und dann viewDidAppear machen Methode wie:
- (void)viewDidAppear:(BOOL)animated {
if (!loaded) {
//code
} else {
return;
}
loaded = YES;
}
Das funktioniert für mich.