2015-08-13 3 views
0

На основании условия пользователь регистрируется на сервере или не показывает другой шаблон. Если пользователь не вошел в систему на сервере приложений, необходимо показать LoginViewController [UIViewController] еще раз показать TabBarViewcontroller [UITabBarViewController].Как установить контроллер начального представления на основе условий?

Так как я использую раскадровку в первый раз. Может ли кто-нибудь посоветовать мне справиться с этим типом состояния в раскадровке?

+0

возможно дубликат [Условное Segue Использование Storyboard] (http://stackoverflow.com/questions/18947328/conditional-segue-using-storyboard) –

+0

возможно дубликат [Условно начинаются в разных местах в раскадровке от AppDelegate] (http://stackoverflow.com/questions/8451975/conditionally-start-at-different-places-in-storyboard-from-appdelegate) – Razvan

ответ

1

Я сделал это следующим образом.

Во-первых, вы создаете нечто вроде LoginViewController. Он реализует логику входа в систему. Ваш корневой контроллер - UITabBarController.

Сейчас в AppDelegate:

- (void) doLogin:(NSDictionary *)dict 
{ 
     TransactionsViewController *transactions; 
     BalancesViewController *balances; 
     ProfileViewController *profile; 
     UINavigationController *navi; 
     UITabBarController *root; 

     root = (UITabBarController *)self.window.rootViewController; 

     navi = [root.viewControllers objectAtIndex:0]; 
     transactions = [navi.viewControllers objectAtIndex:0]; 
     transactions.delegate = self; 

     navi = [root.viewControllers objectAtIndex:1]; 
     balances = [navi.viewControllers objectAtIndex:0]; 
     balances.delegate = self; 

     navi = [root.viewControllers objectAtIndex:2]; 
     profile = [navi.viewControllers objectAtIndex:0]; 
     profile.delegate = self; 

     [transactions loadDataFromLogin:dict]; 
     [balances loadDataFromLogin:dict]; 
     [profile loadDataFromLogin:dict]; 
} 

- (void) showLoginView 
{ 
     assert(loginController == nil); 
     assert(activityView == nil); 

     UITabBarController *tabbar = (UITabBarController *)self.window.rootViewController; 
     loginController = [tabbar.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"]; 
     loginController.delegate = self; 
     [tabbar presentModalViewController:loginController animated:YES]; 
} 

- (void) loginWithLogin:(NSDictionary *)dict relogin:(BOOL)relogin 
{ 
     NSString *_login = [dict valueForKey:@"email"]; 
     NSString *_pass = [dict valueForKey:@"pass"]; 
     NetworkOperation *op = [NetworkOperation operationLogin:_login pass:_pass]; 
     [NetworkOperation enqueueOperation:op observer:self]; 
     if (!relogin && !loginController) 
       [self doLogin:dict]; 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
     session = nil; 
     loginController = nil; 

     return YES; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
     // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
     NSString *login = [[NSUserDefaults standardUserDefaults] stringForKey:@"email"]; 
     NSString *pass = [[NSUserDefaults standardUserDefaults] stringForKey:@"pass"]; 
     NSString *name = [[NSUserDefaults standardUserDefaults] stringForKey:@"name"]; 
     if ((login == nil || login.length == 0) || 
      (pass == nil || pass.length == 0) || 
      (name == nil || name.length == 0)) { 
       if (!loginController) { 
         [self.window makeKeyAndVisible]; 
         [self performSelector:@selector(showLoginView) withObject:nil afterDelay:0.1]; 
       } 
     } else { 
       NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:login, @"email", 
             pass, @"pass", name, @"name", nil]; 
       [self loginWithLogin:dict relogin:(session != nil)]; 
     } 
} 

Так что ваше приложение делегат проверяет если у вас есть пропуск и логин хранится. Если да, то он использует их для входа в систему и переключается на ваш контроллер корневого представления. В моем случае на вкладке отображается вкладка с вкладками с балансами, транзакциями и т. Д.

Если нет логина и пароля, то отобразите контроллер входа в систему сверху вашего контроллера корневого представления.

Здесь @session - это ваша текущая сессия. Вход в систему осуществляется с помощью операций, указанных в коде.

Если вам нужна дополнительная информация, просто пингуйте меня.

0

Вы можете выбрать ViewController с помощью раскадровки названий:

UIStoryboard *yourStoryboard = [UIStoryboard storyboardWithName:@"yourstoryboard" 
                  bundle:nil]; 
YourViewController *vc = [yourStoryboard instantiateViewControllerWithIdentifier:@"yourViewControllerIdentifier"]; 

, а затем представить vc

1

Создать окно и нужный контроллер первоначального вида в application:didFinishLaunchingWithOptions: методы приложения делегата:

self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; 
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
if ([self isUserLoggedIn]) { 
    // Show the dashboard 
    self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"TabBarViewcontroller"]; 
} else { 
    // Login 
    self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"]; 
} 
[self.window makeKeyAndVisible]; 
0

UIStoryboard * раскадровка = [UIStoryboard раскадровкаWithName: @ "Main" bundle: nil]; if ([self isUserLoggedIn]) {
// Показать панель приборов self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier: @ "first"]; } else { // Вход в систему self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier: @ "second"]; }

Смежные вопросы