osx swift swift2

osx - Mostrando condicionalmente NSViewController en el lanzamiento de la aplicación



swift swift2 (1)

Para poner la solución que encontramos en los comentarios como una respuesta:

Aparentemente NSApplication.sharedApplication().mainWindow es una ventana diferente de mi ventana principal en el guión gráfico.

Entonces, creé una subclase NSWindowController y la NSWindowController a la ventana en el guión gráfico, usando el inspector de identidad.

Luego moví la lógica que tenía en la aplicación delegada a este NSWindowController. Se parece a esto:

class MainWindowController: NSWindowController, LoginDelegate { override func windowDidLoad() { if loggedIn { self.onLoggedIn() } else { let loginController = NSStoryboard.loginViewController() loginController.delegate = self self.contentViewController = loginController } } func onLoggedIn() { self.contentViewController = NSStoryboard.mainViewController() } func onLoginSuccess() { self.onLoggedIn() } }

* ¡Gracias Lucas Derraugh por apuntarme en la dirección correcta!

Estoy desarrollando una aplicación OSX donde primero muestro una ventana de inicio de sesión / registro si el usuario aún no ha iniciado sesión.

Después del éxito de inicio de sesión, muestro mi controlador de vista principal.

Si el usuario ya inició sesión (se almacena un token), la aplicación debe iniciarse directamente con el controlador de vista principal.

Soy nuevo en el desarrollo de OSX, busqué en Google este tipo de escenario pero no pude encontrar nada.

Así que subí con lo que creo que debería funcionar. A veces funciona, a veces aparece una ventana en blanco.

En el guión gráfico, dejo el menú principal y el controlador de ventana. Eliminé la transición "contiene" a mi controlador de vista principal.

En AppDelegate, puse esto:

func applicationDidFinishLaunching(aNotification: NSNotification) { if loggedIn { self.showViewController(NSStoryboard.mainViewController()) } else { let loginController = NSStoryboard.loginViewController() loginController.delegate = self self.showViewController(loginController) } } private func showViewController(viewController: NSViewController) { if let mainWindow = NSApplication.sharedApplication().mainWindow { mainWindow.contentViewController = viewController } else { print("Error: No main window!") } }

La mitad de las veces la ventana está vacía y veo en la consola "Error: ¡sin ventana principal!". Pensé que quizás podría usar applicationDidBecomeActive pero esto se llama básicamente cuando se trata del primer plano y esto no es lo que necesito.

Además, cuando funciona, y me conecto, entonces quiero mostrar el controlador de vista principal:

func onLoginSuccess() { self.showViewController(NSStoryboard.mainViewController()) }

Y aquí también aparece "Error: ¡Sin ventana principal!" (siempre) y no pasa nada

Los documentos dicen que después de mainWindow es nulo:

El valor en esta propiedad es nulo cuando el guión gráfico o el archivo de punta de la aplicación aún no se ha terminado de cargar. También puede ser nulo cuando la aplicación está inactiva u oculta.

Pero ¿por qué el storyboard no se terminó de cargar o la aplicación está inactiva cuando la estoy lanzando? Y en el éxito de inicio de sesión, la aplicación está definitivamente activa y en primer plano, y la ventana principal siempre es nula.

¿Qué estoy haciendo mal? ¿Cómo puedo implementar este flujo de trabajo? Alternativamente, podría crear un controlador de vista "padre", tener ese conectado a la ventana en el guión gráfico, y agregar el inicio de sesión o controlador de vista principal como controladores de vista anidados a eso. Pero realmente no me gusta tener que agregar un controlador de vista no hacer nada.

Estoy usando XCode 7 (beta 4), Swift 2, OSX 10.10.4

Editar:

Los métodos NSStoryboard provienen de una extensión, se ve así:

extension NSStoryboard { private class func mainStoryboard() -> NSStoryboard { return NSStoryboard(name: "Main", bundle: NSBundle.mainBundle()) } private class func signupStoryboard() -> NSStoryboard { return NSStoryboard(name: "LoginRegister", bundle: NSBundle.mainBundle()) } class func mainViewController() -> ViewController { return self.mainStoryboard().instantiateControllerWithIdentifier("MainViewController") as! ViewController } class func loginViewController() -> LoginViewController { return self.signupStoryboard().instantiateControllerWithIdentifier("LoginViewController") as! LoginViewController } class func registerViewController() -> RegisterViewController { return self.signupStoryboard().instantiateControllerWithIdentifier("RegisterViewController") as! RegisterViewController } }