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 が 2 回呼び出されるため、最近閉じた 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

ViewController にロードされた BOOL のようなプロパティを追加し、viewdidload でそれを false に設定してから、viewDidAppear メソッドを次のようにすることができます。

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

それは私にとってはうまくいきます。

于 2013-05-02T14:12:13.797 に答える