Xcode: muestra la vista de inicio de session en applicationDidBecomeActive

En mi aplicación me gustaría mostrar una pantalla de inicio de session, que se mostrará cuando se inicie la aplicación y cuando la aplicación se active. Como reference, estoy usando storyboards, ARC y es una aplicación de barra con tabs.

Por lo tanto, necesito hacer el process en el método applicationDidBecomeActive :

 - (void)applicationDidBecomeActive:(UIApplication *)application { if ( ... ) { // if the user needs to login PasswordViewController *passwordView = [[PasswordViewController alloc] init]; UIViewController *myView = self.window.rootViewController; [myView presentModalViewController:passwordView animated:NO]; } } 

Hasta cierto punto esto funciona: puedo llamar a un método en viewDidAppear que muestra una vista de alerta para permitir que el usuario inicie session. Sin embargo, esto no es deseable y me gustaría tener un textbox de inicio de session y otros elementos de interfaz de usuario. Si no llamo a mi método de inicio de session, no pasa nada y la pantalla permanece negra, a pesar de que he colocado una label y otros elementos en la vista.

¿Alguien sabe una forma de resolver esto? Mi vista de código de acceso está incrustada en un controller de navigation, pero se separa del guión gráfico principal.

Una variedad de respuestas finalmente me condujo a una respuesta que no parece demasiado complicada, por lo que publicaré aquí, y realmente se ve muy bien si soy honesta.

En primer lugar, mi vista de contraseña está incrustada en un controller de navigation (Editor -> Incrustar) y está conectada al controller de barra de tabs principal usando una segue modal con un ID, en mi caso 'loginModal'.

En el método applicationDidBecomeActive pon algo como esto:

 [self performSelector:@selector(requestPasscode) withObject:nil afterDelay:0.2f]; 

Y luego coloque esta function en algún lugar del Delegado de la aplicación

 -(void)requestPasscode{ if ( /* If the user needs to login */ ) { [self.window.rootViewController performSegueWithIdentifier:@"loginModal" sender:self]; } } 

Esto presentará su vista de inicio de session cada vez que la aplicación comience o entre en primer plano (por ejemplo, al cambiar de aplicación).

NOTA: La línea anterior no funcionará si la raíz de su aplicación está incrustada en un controller de navigation.

Sin embargo, hay dos errores;

  1. Si el usuario estaba viendo una vista modal antes de descartar la aplicación
  2. Si el usuario descartó la aplicación en la vista de contraseña.

Ambos provocan que la aplicación se bloquee, por lo que la siguiente línea entra en el método applicationWillResignActive .

 [self.window.rootViewController dismissViewControllerAnimated:NO completion:nil]; 

Básicamente descarta todas las vistas modales que se presentan. Esto puede no ser ideal, pero las vistas modales con mayor frecuencia no se usan para la input de datos y, en muchos casos, este es un efecto deseado.

Debe iniciar el Contralor de PasswordViewController PasswordViewController desde xib o si usted almacena la interfaz de usuario en Storyboard, debería usar Segue para este controller.

No puedo decir sobre otras partes, pero esa parte me parece muy extraña.

Mi vista de código de acceso está incrustada en un controller de navigation, pero se separa del guión gráfico principal.

en guiones charts puede almacenar controlleres de vista y ver dentro de los controlleres de visualización, por lo que no es bueno almacenar alguna vista fuera del controller de visualización porque no podrá cargar esta vista desde el guión gráfico después de recibir una advertencia de memory. Por favor, corrígeme si no entendí a qué te refieres.

Si vamos por su path, no hay diferencia cargar PasswordViewController en applicationDidBecomeActive o en su primer controller de vista en Storyboards porque usted llama al controller de vista actual desde el primer controller de vista cargado. Entonces puedes hacerlo en tu primer controller de vista. También puede almacenar algunas vistas ocultas dentro de su primer control de visualización y mostrar esta vista si el usuario necesita iniciar session.

Lo probé. Así que al principio su controller se cargó y luego obtuvo el método applicationDidBecomeActive . Por lo tanto, es mejor poner su código en el interior -(void)viewDidAppear:animated método -(void)viewDidAppear:animated de su primer control de vista.

Saludos, Danil