如何只调用一次ViewDidAppear?

时间:2010-02-14 02:53:36

标签: 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");

}

但是当用户使用:

关闭stockholm.xib时
[self dismissModalViewControllerAnimated:YES];

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

现在,如何调用视图确实只出现一次?那么当用户从斯德哥尔摩回来时,viewDidAppear将不会被调用?任何其他解决方案?

thanx:)

3 个答案:

答案 0 :(得分:14)

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

编辑:更多代码以显示我在评论中的含义

<。>文件中的

BOOL firstTime;
<。>文件中的

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

答案 1 :(得分:6)

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

@interface MyClass {
    dispatch_once_t once;
}

@end

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

答案 2 :(得分:1)

您可以将加载BOOL的属性添加到viewcontroller,在viewdidload中将其设置为false,然后将viewDidAppear方法设置为:

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

这适合我。