【问题标题】:How can I call the ViewDidAppear only one time?我怎样才能只调用一次 ViewDidAppear?
【发布时间】:2011-01-16 15:04:51
【问题描述】:

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

感谢:)

【问题讨论】:

    标签: iphone sdk xib viewdidappear


    【解决方案1】:

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

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

    在 .h 文件中:

    BOOL firstTime;
    

    在 .m 文件中:

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

    【讨论】:

    • 是的,原因是如果我移动这个:Stockholm *Start =[[Stockholm alloc]initWithNibName:nil bundle:nil]; [self presentModalViewController:开始动画:YES];查看didLoad,它不会工作。
    • 如果您只想在视图第一次出现时显示它,只需使用布尔标志来判断它是否是第一次。布尔第一次=真; if(... && firstTime) { firstTime = false; ...}
    • 还是不行。 .h 静态 BOOL firstTime=TRUE; .m -(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; if (firstTime=TRUE) { //进入自定义页面 } firstTime=FALSE;我得到这个错误:0x018ce464 jne 0x18ce481 请帮忙!
    【解决方案2】:

    如果你的类有如下字段,你也可以使用 GCD:

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

    【讨论】:

    • 编辑:仍然需要标志。使用静态方法意味着无论创建多少视图控制器实例,代码都只会运行一次。
    • 似乎是个好主意,但实际上会导致未定义的行为:The predicate must point to a variable stored in global or static scope. The result of using a predicate with automatic or dynamic storage is undefined.
    【解决方案3】:

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

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

    这对我有用。

    【讨论】:

      猜你喜欢
      • 2016-03-23
      • 1970-01-01
      • 2017-08-30
      • 2022-12-20
      • 2020-11-28
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 2018-07-01
      相关资源
      最近更新 更多