7

当用户启动应用程序时,我希望它显示 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 吗?任何其他解决方案?

谢谢 :)

4

3 回答 3

14

您可以尝试在方法中移动所有这些功能,viewDidLoad:而不是viewDidAppear. 那只火一次。除非你有理由不...?

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

在 .h 文件中:

BOOL firstTime;

在 .m 文件中:

-(void)viewDidLoad {
   NSLog(@"viewDidLoad actually fired");
   //...
   firstTime = YES;
}
-(void)viewDidAppear {
   //...
   if(firstTime){
      //show it
      firstTime = NO;
   }
}
于 2010-02-14T03:00:43.453 回答
6

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

@interface MyClass {
    dispatch_once_t once;
}

@end

@interface MyClass {
    - (void)viewDidAppear:(BOOL)animated {
        dispatch_once(&once, ^{
            // do business
        });
    }
@end
于 2012-02-07T20:53:27.590 回答
1

您可以将加载的 BOOL 等属性添加到您的视图控制器,在 viewdidload 中将其设置为 false,然后使您的 viewDidAppear 方法如下:

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

这对我行得通。

于 2013-05-02T14:12:13.797 回答