2010-02-14 25 views
7

kullanıcı bunu stockholm.xib göstermek istediğiniz uygulamayı başlatmak ve Burada yaptığında:ViewDidAppear'ı yalnızca bir kez nasıl arayabilirim?

-(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"); 

} 

ancak kullanıcı stockholm.xib kapattığında kullanarak:

[self dismissModalViewControllerAnimated:YES]; 

animasyon sonra bitti, uygulama çöküyor. ve nedeni, sanırım viewDidAppear iki kez çağırır ve bu nedenle son zamanlarda kapatılan xib dosyasını açmaya çalışıyor.

şimdi, görünümü nasıl arayabilirim yalnızca bir kez mi görüntülendi? Böylece kullanıcı Stockholm'den geri döndüğünde viewDidAppear aranmayacak mı? başka bir çözüm mü?

teşekkürler :) Sen viewDidAppear yerine viewDidLoad: yöntemde tüm işlevselliğe taşımayı deneyebilirsiniz

cevap

14

. Bu sadece bir kez ateş eder. Yapmaman için bir sebep yoksa ...?

DÜZENLEME:

BOOL firstTime; 

.m dosyasında:

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

evet, bunun sebebi şudur: Bunu hareket ettirirsem: Stockholm * Başlangıç ​​= [[Stockholm ayırma] initWithNibName: nil bundle: nil]; [self presentModalViewController: Animasyon başlat: YES]; ViewdidLoad için , işe yaramaz. – hafhadg3

+1

Sadece görünümü ilk kez görüntülüyorsanız, ilk defa olup olmadığını öğrenmek için bir boole bayrağı kullanın. BOOL firstTime = true; if (... && firstTime) {firstTime = false; ...} – Dimitris

+0

Hala çalışmıyor. .h statik BOOL firstTime = TRUE; .m - (void) viewDidAppear: (BOOL) animasyonlu { \t [super viewDidAppear: animasyonlu]; \t (firsttime = TRUE) \t firsttime { \t \t // özel Page \t git} eğer = FALSE; 0x018ce464 <+0665> JnE 0x18ce481 <- [UIWindowController transitionViewDidComplete: fromView: bileti görüntüleyebilir:] + 694> } bu hatası alıyorum YARDIM lütfen! – hafhadg3

6

Sen GCD'yı kullanabilirsiniz daha kod i .h dosyasında açıklama

içinde ne anlama geldiğini göstermek için Ayrıca, sınıfınızın şu gibi bir alanı varsa:

+2

DÜZENLEME: Bayrakya hala ihtiyacınız var. Bir yöntemin statik kullanılması, denetim denetleyicisinin kaç örneğinin oluşturulup oluşturulmadığına bakılmaksızın kodun yalnızca bir kez çalıştırılacağı anlamına gelir. – ZaBlanc

+0

Bu, _seems_ iyi bir fikir gibi, ama aslında tanımsız davranışla sonuçlanacak: 'Yükleyici, global veya statik kapsamda saklanan bir değişkene işaret etmelidir. Otomatik veya dinamik depolama ile bir yüklemenin kullanılması undefined. – datwelk

1

Sen BOOL sizin viewcontroller yüklenen gibi özellik eklemek ayarlayın false viewDidLoad ve sonra sevdiği viewDidAppear yöntemini yapabilirsiniz: benim için çalışıyor

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

.

İlgili konular