2013-09-02 11 views
6

Próbuję przejść do nowego kontrolera widoku, zanim pojawi się obecny kontroler widoku, ale nie mogę go uzyskać. Zasadniczo moja aplikacja rozpoczyna się na stronie powitalnej i sprawdza, czy masz zapisane NSUserDefaults, a jeśli tak, otwiera główny kontroler widoku. Jednak nie chcę, aby użytkownik zobaczył ten widok przed zobaczeniem głównego widoku, gdy jest już użytkownikiem, nie jest przyjazny dla użytkownika. Chcę, aby bieżący użytkownik zobaczył obraz uruchamiania, a następnie bezpośrednio widok główny. Jednak tak naprawdę nie mogę tego zrobić. To właśnie zrobiłem, co wywołuje niepożądany efekt.Dostałem się do innego kontrolera widoku, zanim pojawi się bieżący kontroler widoku.

- (void)viewDidAppear:(BOOL)animated { 
[super viewDidAppear:animated]; 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSString *user = [prefs stringForKey:@"userName"]; 

if(user.length>0){ 
    NSLog(@"Going straight to main %s", "Yes"); 
    [self performSegueWithIdentifier:@"startMain" sender:self]; 

    } 
} 

Jak sobie z tym poradzę?

Odpowiedz

-3

spróbować tego w appDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSString *user = [prefs stringForKey:@"userName"]; 
    if(user.length>0){ 
     NSLog(@"Going straight to main %s", "Yes"); 
     [self performSegueWithIdentifier:@"startMain" sender:self]; 

    } else { 
     self.window.rootViewController = splashScreenViewController; 
    } 
} 
+1

dzięki za pomoc człowieka. Próbuję twój kod i nie wygląda na to, że appdelegate zna metodę performSegueWithIdentifier. Zakładam, że jest to metoda pod hierarchią viewcontroller. –

1

W celu osiągnięcia tego, co chcesz, i. e., nie widzisz pierwszy viewController w ogóle, musisz usunąć animację w przejściu. Bez animacji użytkownik zobaczy, że drugiViewController był pierwszym prezentowanym.

Możesz to osiągnąć na wiele sposobów. Jeden z nich (zakładając, że jest to modal), tworzyłby nową scenę w scenorysie, z innym identyfikatorem i bez animacji, i wywoływałby go, gdyby twój warunek był prawdziwy.

To byłoby coś takiego:

- (void)viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSString *user = [prefs stringForKey:@"userName"]; 

    if(user.length>0){ 
     NSLog(@"Going straight to main %s", "Yes"); 
     [self performSegueWithIdentifier:@"startMain-noAnimation" sender:self]; 
     } 
} 
+0

Nie można tego zrobić w viewDidLoad - pojawi się błąd informujący, że próbujesz przedstawić kontroler widoku podczas wykonywania innej prezentacji. Musisz go zostawić w viewDidAppear, ale bez animacji takiej jak powiedziałaś. – rdelmar

+0

To niezręczne, ponieważ mam projekt, który prezentuje modalny ekran logowania wewnątrz 'viewDidLoad' (poprzez' presentViewController: animated: completion: '). Mój kontroler jest wewnątrz tabBarController, nie wiem, czy to ma coś zrobić –

+0

Czy na pewno zrobiłeś to w viewDidLoad? Właśnie przetestowałem to na kontrolerze, który jest na pierwszej karcie kontrolera paska kart, i dostałem błąd: "Ostrzeżenie: Próba zaprezentowania na którego widok nie znajduje się w hierarchii okna ! ". Otrzymuję ten sam błąd, jeśli próbuję go w viewWillAppear. – rdelmar

0

ja wymyśliliśmy sposób, aby to zrobić, korzystając z appdelegate i storyboardu identyfikatory. Oto co zrobiłem.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 

    //Check to see if this is a current user or a new user 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSString *user = [prefs stringForKey:@"userName"]; 

    //Current User 
    if(user.length>0){ 
     self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; 

     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 

     UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"2"]; 

     self.window.rootViewController = viewController; 
     [self.window makeKeyAndVisible]; 

    } else { 
     self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; 

     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 

     UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"1"]; 

     self.window.rootViewController = viewController; 
     [self.window makeKeyAndVisible]; 
    } 


    return YES; 
} 
Powiązane problemy