Pantalla de inicio de session con Swift y iOS 8 Storyboard

Tengo muchos problemas para manejar el flujo de inicio de session de mi aplicación iOS. Una image del storyboard que estoy tratando de lograr está debajo

introduzca la descripción de la imagen aquí

Estoy tratando de lograr una pantalla de inicio de session opcional que se presenta solo cuando un usuario abre la aplicación por primera vez y no ha iniciado session. Actualmente, tengo el controller de barra de tabs configurado como el controller de vista raíz. Sin embargo, no puedo entender cómo manejar el intercambio entre estos controlleres de vista.

He intentado simplemente empujar la pantalla de inicio de session con el siguiente código. Sin embargo, no funciona. Creo que el problema de que un controller de barra de tabs no está permitido para impulsar nuevos controlleres de vista.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { //stuff if userLoggedIn { // Do nothing } else { //get access to login view var storyboard = UIStoryboard(name: "Main", bundle: nil) var viewController = storyboard.instantiateViewControllerWithIdentifier("signupView") as UIViewController; // Then push login view var rootViewController = self.window!.rootViewController as UITabBarController; rootViewController.pushViewController(viewController, animated: true) } // Override point for customization after application launch. return true } 

¿Hay alguna manera de cambiar los controlleres de vista sin presionar dentro de un controller de navigation? Cualquier consejo sobre cómo manejar este tipo de flujo de inicio de session sería muy apreciado.

Lo consigo con un "LaunchViewController" que determina si debería presentar la vista de inicio de session o el controller de navigation principal.

Marque la vista de inicio de su vista inicial en el guión gráfico y escriba la lógica allí para determinar qué presentar. Este process a menudo es muy rápido e imperceptible para el usuario.

ACTUALIZACIÓN :

Como mencioné en mi comentario, he tomado una dirección diferente. Ahora, en el método de la aplicación Delegado de la application(application:didFinishLaunchingWithOptions:) , realizo la lógica necesaria para determinar qué vista debería ser el rootViewController y establecerlo allí usando lo siguiente.

 extension AppDelegate { enum LaunchViewController { case Login, Dashboard var viewController: UIViewController { switch self { case .Login: return StoryboardScene.Login.LoginScene.viewController() case .Dashboard: return StoryboardScene.Dashboard.initialViewController() } } /// Sets `UIWindow().rootViewController` to the appropriate view controller, by default this runs without an animation. func setAsRootviewController(animated animated: Bool = false) { let appDelegate = UIApplication.shanetworkingApplication().delegate as! AppDelegate let window = appDelegate.window! let launchViewController = viewController log.info?.message("Setting \(launchViewController.dynamicType) as rootViewController") if let rootViewController = window.rootViewController where rootViewController.dynamicType != launchViewController.dynamicType && animated { let overlayView = UIScreen.mainScreen().snapshotViewAfterScreenUpdates(false) launchViewController.view.addSubview(overlayView) UIView.animateWithDuration(0.3, animations: { overlayView.alpha = 0.0 }, completion: { _ in overlayView.removeFromSuperview() }); } window.rootViewController = launchViewController window.restrationIdentifier = String(launchViewController.dynamicType) if window.keyWindow == false { window.makeKeyAndVisible() } } } } 

Tenga en count que StoryboardScene no es un tipo pnetworkingeterminado, estoy usando https://github.com/AliSoftware/SwiftGen para generar eso.

El método My Delegate de la aplicación parece algo así.

 if window == nil { window = UIWindow(frame: UIScreen.mainScreen().bounds) } if isRestoringState == false { if let _ = lastUsedAccount { LaunchViewController.Dashboard.setAsRootviewController() } else { LaunchViewController.Login.setAsRootviewController() } } 

ACTUALIZACIÓN con el método Logout para comentario

 func handleLogout(notification: NSNotification) { LaunchViewController.Login.setAsRootviewController(animated: true) lastUsedAccount = nil } 

Aquí es lo que hice y funciona bien:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { if (!AppData.shanetworkingInstance.loggedIn) { let signInNavigation = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("SignInNavigationControllerIdentifier") as? UINavigationController self.window!.rootViewController = signInNavigation; } return true } 

Set Is Initial View Controller para LoginViewController.

introduzca la descripción de la imagen aquí

Retire de AppDelegate.swift y colóquelo en LoginViewController .

 if userLoggedIn { // Do nothing } else { //get access to login view var storyboard = UIStoryboard(name: "Main", bundle: nil) var viewController = storyboard.instantiateViewControllerWithIdentifier("signupView") as UIViewController; // Then push login view var rootViewController = self.window!.rootViewController as UITabBarController; rootViewController.pushViewController(viewController, animated: true) } 

Ejecuta tu proyecto.