iOS 5 Segue не работает после первого выполнения - PullRequest
2 голосов
/ 14 февраля 2012

Я создаю приложение iOS5 с использованием функций раскадровки. Базовая структура:

LoginScreen --- (переход) -> MyScreen --- (нажмите для выхода из системы) ------ (переход к экрану входа) -> LoginScreen

это довольно просто. Я управляю первым переходом следующим образом:

- (void) onResponse:(NSMutableDictionary *)response {
  NSLog(@"Login successful,token received");
  // if the Login was successful,store the token 
  NSUserDefaults* userPref = [NSUserDefaults standardUserDefaults];    
  [userPref setObject:[response objectForKey:@"Token"] forKey:@"AuthToken"];
  [userPref synchronize];
  //..and let the user getting in
  [self performSegueWithIdentifier:@"showHomeScreen" sender:nil];
}

Теперь странно то, что переход выполняется правильно с первого раза, но когда я возвращаюсь к экрану входа после выхода из системы, executeSegueWithIdentifier: больше не работает (сообщений об ошибках нет) , просто ничего не происходит). Не уверен, что происходит. В чем может быть проблема?

Я прилагаю скриншот раскадровки .. Вы можете увидеть цикл в верхнем правом углу: enter image description here

Большое спасибо!

Клаус

1 Ответ

4 голосов
/ 14 февраля 2012

Похоже, что LoginVC подключен к нескольким Segue.

Лучший способ справиться с этим процессом входа в систему - это использовать делегата для ViewController для входа в систему.Затем в главном VC вы проверяете учетные данные или что-то еще, и при необходимости вызываете executeSegue для LoginVC.Когда вход успешен, вы вызываете метод делегата, и Главный VC отклоняет модальное представление.LoginVC действительно не должен быть частью навигации или подключен к каким-либо другим Segues, кроме одного из Main VC.У меня есть полный пример, если вам это нужно, но это легко реализовать с помощью методов делегатов.

Вот вам: LoginViewController.h:

@protocol LoginViewControllerDelegate
    -(void)finishedLoadingUserInfo;
@end

@interface LoginViewController : UIViewController <UITextFieldDelegate>{
    id <LoginViewControllerDelegate> delegate;
}

LoginViewController.m:

@synthesize delegate;

- (void) onResponse:(NSMutableDictionary *)response {
  NSLog(@"Login successful,token received");
  // if the Login was successful,store the token 
  NSUserDefaults* userPref = [NSUserDefaults standardUserDefaults];    
  [userPref setObject:[response objectForKey:@"Token"] forKey:@"AuthToken"];
  [userPref synchronize];
  //..and let the user getting in
  [delegate finishedLoadingUserInfo];
}

В файле .m Dashboard VC:

#pragma mark - LoginViewController Delegate Method
-(void)finishedLoadingUserInfo
{    
    // Dismiss the LoginViewController that we instantiated earlier
    [self dismissModalViewControllerAnimated:YES];

    // Do other stuff as needed
}

Таким образом, суть заключается в проверке учетных данных при загрузке приложения и, если необходимо, вызове (в VC Dashboard):

[self performSegueWithIdentifier:@"sLogin" sender:nil];

Затем в методе prepareForSegue (в VC Dashboard):

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"sLogin"]) {
        LoginViewController *livc = segue.destinationViewController;
        livc.delegate = self; // For the delegate method
    }
}

Обязательно назовите Segue sLogin, иначе это не сработает:)

Storyboard

...