2010-02-14 41 views
7

當用戶開始我想它顯示stockholm.xib 的應用程序,它在這裏所做的:我怎樣才能調用ViewDidAppear只有一次?

-(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不會被調用?其他解決方案?

感謝名單:)

回答

14

您可以嘗試在viewDidLoad:方法將所有這些功能,而不是viewDidAppear的。那個只發射一次。除非你有理由不... ...?

編輯:更多的代碼來說明我的意思在.h文件中的註釋

BOOL firstTime; 

在.m文件:

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

是的,原因是如果我移動這個: 斯德哥爾摩*開始= [[斯德哥爾摩分配] initWithNibName:零捆綁:無]; [self presentModalViewController:Start animated:YES]; to viewdidLoad,它不會工作。 – hafhadg3 2010-02-14 12:48:04

+1

如果您只想在第一次出現視圖時顯示它,只需使用布爾標誌來判斷它是否是第一次。 BOOL firstTime = true; if(... && firstTime){firstTime = false; ...} – Dimitris 2010-02-14 13:17:04

+0

它仍然無法正常工作。 .h static BOOL firstTime = TRUE; .m - (void)viewDidAppear:(BOOL)animated { \t [super viewDidAppear:animated]; \t如果(firstTime = TRUE){ \t \t //轉到自定義頁面 \t} \t firstTime = FALSE; } 我得到這個錯誤: 0x018ce464 <+0665> JNE 0x18ce481 < - [UIWindowController transitionViewDidComplete:fromView:toView:] + 694> 請幫幫忙! – hafhadg3 2010-02-17 21:37:22

6

您可以使用GCD同樣,如果你的班級有一個字段,例如:

@interface MyClass { 
    dispatch_once_t once; 
} 

@end 

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

編輯:仍然需要國旗。使用靜態方法意味着無論創建多少個視圖控制器實例,代碼都只運行一次。 – ZaBlanc 2012-02-19 03:40:19

+0

這似乎是一個好主意,但它實際上會導致未定義的行爲:謂詞必須指向存儲在全局或靜態作用域中的變量。使用帶有自動或動態存儲的謂詞的結果是未定義的 – datwelk 2013-12-08 13:08:42

1

您可以添加屬性像BOOL加載到你的ViewController,將其設置爲false在viewDidLoad中,然後讓你的viewDidAppear方法,如:

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

這對我的作品。