如何只调用一次ViewDidAppear?

haf*_*dg3 7 iphone sdk xib viewdidappear

当用户启动应用程序时,我希望它显示stockholm.xib,它在此处执行:

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

}
Run Code Online (Sandbox Code Playgroud)

但是当用户使用以下方法关闭stockholm.xib时:

[self dismissModalViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

动画完成后,应用程序崩溃.原因是,我猜,viewDidAppear调用了两次,因此它试图打开最近关闭的xib文件.

现在,我如何调用视图确实只出现过一次?那么当用户从斯德哥尔摩回来时,viewDidAppear将不会被调用?还有其他方法吗?

thanx :)

Dim*_*ris 14

您可以尝试移动方法中的所有功能viewDidLoad:而不是viewDidAppear.那只发射一次.除非你有理由不......

编辑:更多代码,以显示我在评论中的意思

在.h文件中:

BOOL firstTime;
Run Code Online (Sandbox Code Playgroud)

在.m文件中:

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


ZaB*_*anc 6

如果您的班级有以下字段,您也可以使用GCD:

@interface MyClass {
    dispatch_once_t once;
}

@end

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

  • 编辑:仍然需要国旗.使用静态方法意味着无论创建了多少个视图控制器实例,代码都只运行一次. (2认同)