2015-11-29 6 views
0

У меня есть приложение, которое имеет LoginViewController и DashboardViewController. Если пользователь успешно войдет в систему, он/она будет отправлен в DashboardViewController.Вывести контроллер вида на несуществующий контроллер вида

В LoginViewController есть Запомнить меня. Если пользователь регистрирует его при входе в систему, это значение сохраняется в NSUserDefaults, которое будет использоваться для последующих логов. Например, если пользователь включит опцию Запомнить меня, когда при входе в систему при следующем открытии приложения пользователь будет отправлен в DashboardViewController напрямую, даже не показывая LoginViewController.

Вот структура раскадровки, которую у меня есть.

enter image description here

В AppDelegate, я поставил RootViewController окна в зависимости от сохраненного значения NSUserDefaults.

if !NSUserDefaults.standardUserDefaults().boolForKey(Globals.IsLoggedIn) { 
    // Show login screen 
    let loginViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("LoginViewController") 
    let navigationController = UINavigationController(rootViewController: loginViewController) 
    window?.rootViewController = navigationController 
} else { 
    // Show Dashboard 
    let dashboardViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateInitialViewController()! 
    let navigationController = UINavigationController(rootViewController: dashboardViewController) 
    window?.rootViewController = navigationController 
} 

Все работает хорошо. Проблема в том, когда я должен выйти из системы.

В навигационной панели в DashboardViewController есть UIBarButtonItem, который регистрирует вас при нажатии и подтверждении.

let alert = UIAlertController(title: "Logout", message: "Are you sure you want to logout?", preferredStyle: .Alert) 
alert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) 
alert.addAction(UIAlertAction(title: "Yes", style: .Default, handler: { (action) -> Void in 
    NSUserDefaults.standardUserDefaults().setBool(false, forKey: Globals.IsLoggedIn) 
    self.navigationController?.popViewControllerAnimated(true) 
})) 
presentViewController(alert, animated: true, completion: nil) 

Если пользователь входит в систему из LoginViewController, перейти к DashboardViewController и журналы вне, DashboardViewController выскакивает навигации стека и появляется LoginViewController. Все хорошо.

Но скажите, что у меня включена опция «Запомнить меня» в предыдущем журнале и я открываю приложение. Теперь я сразу попал в DashboardViewController. Обратите внимание, как navigationController, внедряющий DashboardViewController, устанавливается как rootViewController окна.

Так что, если я сейчас выйду из системы, нет экземпляра LoginViewController, чтобы вернуться к нему, потому что он никогда не добавлялся в первую очередь!

Как разрешить этот сценарий? Есть ли способ тайно создать экземпляр LoginViewController, даже если непосредственно показывать DashboardViewController напрямую, но тихо добавить его в стек навигации, но все же показать DashboardViewController в качестве первого контроллера представления или что-то еще?

Или вы порекомендовали бы другой подход, общая архитектура?

ответ

1

Попробуйте это:

let vc = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") 
self.navigationController?.viewControllers.insert(vc!, atIndex: 0) // at the beginning 
self.navigationController?.popViewControllerAnimated(true) 
+0

Это ловкий трюк. Я [изменен] (http://pastie.org/10589772) мой код основан на вашем решении, и он отлично работает. Спасибо. – Isuru

+0

Да, чувствует себя хорошо, когда вы узнаете, как использовать доступные инструменты. –

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