How can I call the ViewDidAppear only one time?
-
26-04-2021 - |
Pergunta
When the user start the app I want it show the stockholm.xib and It does here:
-(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");
}
but when user closes the stockholm.xib using:
[self dismissModalViewControllerAnimated:YES];
after the animation is done, the app crashes. and the reason is, I guess, viewDidAppear calls twice and therefore it is trying to open the recently closed xib file.
now, how Can I call the view did appear only once? so that when the user comes back from Stockholm the viewDidAppear wont be called? any other solution?
thanx :)
Solução
You can try moving all that functionality in the viewDidLoad:
method instead of the viewDidAppear
. That one only fires once. Unless there is a reason for you not to...?
EDIT: more code to show what i mean in the comment
in the .h file:
BOOL firstTime;
in the .m file:
-(void)viewDidLoad {
NSLog(@"viewDidLoad actually fired");
//...
firstTime = YES;
}
-(void)viewDidAppear {
//...
if(firstTime){
//show it
firstTime = NO;
}
}
Outras dicas
You can use GCD, too, if your class has a field such as:
@interface MyClass {
dispatch_once_t once;
}
@end
@interface MyClass {
- (void)viewDidAppear:(BOOL)animated {
dispatch_once(&once, ^{
// do business
});
}
@end
You can add the property like BOOL loaded to your viewcontroller, set it to false in the viewdidload, and then make your viewDidAppear method like:
- (void)viewDidAppear:(BOOL)animated {
if (!loaded) {
//code
} else {
return;
}
loaded = YES;
}
That works for me.