Frage

Wenn der Benutzer die App starten ich will es zeigen die stockholm.xib und es tut sich hier:

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

}

aber, wenn der Benutzer schließt die stockholm.xib mit:

[self dismissModalViewControllerAnimated:YES];

, nachdem die Animation fertig ist, stürzt die App. und der Grund ist, ich denke, viewDidAppear ruft zweimal und es deshalb versucht, die vor kurzem geschlossene xib Datei zu öffnen.

jetzt, wie kann ich nennen die Ansicht nur ein einziges Mal erscheinen? so dass, wenn der Benutzer aus Stockholm kommt wieder die viewDidAppear werde nicht genannt werden? eine andere Lösung?

Danke:)

War es hilfreich?

Lösung

Sie können versuchen, alle diese Funktionalität in der viewDidLoad: Verfahren bewegt anstelle des viewDidAppear. Dass man feuert nur einmal. Es sei denn, es gibt einen Grund für Sie nicht ...?

EDIT: mehr Code zu zeigen, was ich in dem Kommentar

bedeuten

in der H-Datei:

BOOL firstTime;

in der .m-Datei:

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

Andere Tipps

Sie können GCD nutzen, auch wenn Sie Ihre Klasse hat ein Feld, wie zum Beispiel:

@interface MyClass {
    dispatch_once_t once;
}

@end

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

Sie können die Eigenschaft hinzufügen wie BOOL zu Ihrem Viewcontroller geladen, stellen Sie ihn auf false im viewDidLoad, und dann viewDidAppear machen Methode wie:

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

Das funktioniert für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top