Tengo un guión gráfico configurado con inicio de sesión en funcionamiento y controlador de vista principal, este último es el controlador de vista al que se navega al usuario cuando el inicio de sesión es exitoso. Mi objetivo es mostrar el controlador de vista principal inmediatamente si la autenticación (almacenada en el llavero) es exitosa y mostrar el controlador de vista de inicio de sesión si la autenticación falló. Básicamente, quiero hacer esto en mi AppDelegate:
// url request & response work fine, assume success is a BOOL here
// that indicates whether login was successful or not
if (success) {
// 'push' main view controller
} else {
// 'push' login view controller
}
Sé sobre el método performSegueWithIdentifier: pero este método es un método de instancia de UIViewController, por lo que no se puede llamar desde AppDelegate. ¿Cómo hago esto usando mi guión gráfico existente?
EDITAR:
El controlador de vista inicial del Storyboard ahora es un controlador de navegación que no está conectado a nada. Usé la distinción setRootViewController: porque MainIdentifier es un UITabBarController. Entonces así es como se ven mis líneas:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
BOOL isLoggedIn = ...; // got from server response
NSString *segueId = isLoggedIn ? @"MainIdentifier" : @"LoginIdentifier";
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
UIViewController *initViewController = [storyboard instantiateViewControllerWithIdentifier:segueId];
if (isLoggedIn) {
[self.window setRootViewController:initViewController];
} else {
[(UINavigationController *)self.window.rootViewController pushViewController:initViewController animated:NO];
}
return YES;
}
¡Las sugerencias / mejoras son bienvenidas!
[[self window] makeKeyAndVisible]
a application: didFinishLaunchingWithOptions: antes de intentar realizar las segues condicionales. Se supone que UIApplicationMain () envía un mensaje a makeKeyAndVisible pero lo hace solo después de didFinish ... Opciones: finaliza. Busque "Coordinación de esfuerzos entre controladores de vista" en los documentos de Apple para obtener más detalles.Me sorprenden algunas de las soluciones que se sugieren aquí.
Realmente no hay necesidad de controladores de navegación ficticios en su guión gráfico, ocultando vistas y disparando segues en viewDidAppear: o cualquier otro truco.
Si no tiene el guión gráfico configurado en su archivo plist, debe crear tanto la ventana como el controlador de vista raíz usted mismo :
Si el guión gráfico está configurado en el plist de la aplicación, la ventana y el controlador de vista raíz ya estarán configurados por la aplicación de tiempo: se llama didFinishLaunching: y se llamará a makeKeyAndVisible en la ventana.
En ese caso, es aún más simple:
fuente
SI el punto de entrada de su guión gráfico no es un
UINavigationController
:SI el punto de entrada de su guión gráfico ES un
UINavigationController
reemplazo:con:
fuente
appHasLaunchedOnce ? secondViewControllerIdentifier : firstViewControllerIdentifier;
En el
application:didFinishLaunchingWithOptions
método de su AppDelegate , antes de lareturn YES
línea, agregue:Reemplace
YourStartingViewController
con el nombre de su primera clase de controlador de vista real (la que no desea que aparezca necesariamente) yYourSegueIdentifier
con el nombre real de la transición entre ese controlador inicial y el que realmente desea comenzar (el que está después de la transición ).Envuelve ese código en un
if
condicional si no siempre quieres que suceda.fuente
Dado que ya está usando un Storyboard, puede usar esto para presentarle al usuario MyViewController, un controlador personalizado ( resumiendo la respuesta de followben un poco ).
En AppDelegate.m :
La cadena que se pasa a instantiateViewControllerWithIdentifier se refiere al ID del guión gráfico, que se puede configurar en el generador de interfaces:
Simplemente envuelva esto en lógica según sea necesario.
Sin embargo, si está comenzando con un UINavigationController, este enfoque no le proporcionará controles de navegación.
Para 'saltar hacia adelante' desde el punto de partida de un controlador de navegación configurado a través del generador de interfaz, utilice este enfoque:
fuente
¿Por qué no tener la pantalla de inicio de sesión que aparece primero, comprobar si el usuario ya ha iniciado sesión y presionar la siguiente pantalla de inmediato? Todo en ViewDidLoad.
fuente
Rápida implementación de la misma:
Si lo usa
UINavigationController
como punto de entrada en el guión gráficofuente
Esta es la solución que funcionó en iOS7. Para acelerar la carga inicial y no realizar ninguna carga innecesaria, tengo un UIViewcontroller completamente vacío llamado "DUMMY" en mi archivo de Storyboard. Entonces puedo usar el siguiente código:
fuente
Sugiero crear un nuevo MainViewController que sea el controlador de vista raíz del controlador de navegación. Para hacer eso, simplemente mantenga el control, luego arrastre la conexión entre el controlador de navegación y MainViewController, elija 'Relación - Controlador de vista raíz' en el indicador.
En MainViewController:
Recuerde crear segues entre MainViewController con los controladores de vista Inicio e Inicio de sesión. Espero que esto ayude. :)
fuente
Después de probar muchos métodos diferentes, pude resolver este problema con esto:
fuente