iphone - Práctica recomendada para mostrar una pantalla de inicio de sesión única con guiones gráficos
ios login (3)
He visto preguntas similares aquí, pero no con una respuesta clara. Así que tengo una vista de inicio de sesión modal con el formulario clásico de nombre de usuario / contraseña, un botón de inicio de sesión de Facebook y un botón de Registrarse que me gustaría mostrar cuando el usuario inicie la aplicación por primera vez. De lo que encontré hay dos formas de implementar esto, con shortcumings.
- en el archivo didFinishLaunchingWithOptions de AppDelegate, se establece un condicional para verificar si el usuario está conectado. De lo contrario, el controlador de raíz se establece en el loginViewController. Después de un inicio de sesión exitoso, se realiza una transición a la vista principal de la aplicación. Mi problema con este enfoque es que no estoy seguro de cómo restablecer el RootViewController a la vista principal. ¿Es eso posible y cómo?
¿Hay alguna otra forma de mostrar el modal de inicio de sesión sin configurar el control raíz de control? Lo que significa que mantendría mi rVC en la vista principal.
en el controlador de vista principal en el viewDidAppear un condicional comprueba si el usuario está conectado. Si no se realiza una transición al loginVC. Cuando el usuario inicia sesión con éxito, regresa a la vista principal que rechazó la vista de inicio de sesión modal. El problema con este enfoque es que se muestra brevemente la vista principal, que preferiría no hacer.
¿Alguna otra idea? Por favor, hágame saber cuál es la mejor práctica cuando se trata de este escenario. Gracias de antemano,
Puede configurar el control raíz de control a través de AppDelegate simplemente configurando un controlador de navegación y, cuando lo haga, configure la vista raíz del controlador de navegación en la vista que desee que se muestre en ese momento. Creo que algo como esto debería funcionar si agrega una declaración if para lo que quiere hacer:
// Override point for customization after application launch.
RootViewController *rootController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootController];
self.window.rootViewController = navigationController;
Después de probar muchos métodos diferentes, pude resolver este problema con esto:
-(void)viewWillAppear:(BOOL)animated {
// Check if user is already logged in
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if ([[prefs objectForKey:@"log"] intValue] == 1) {
self.view.hidden = YES;
}
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
// Check if user is already logged in
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if ([[prefs objectForKey:@"log"] intValue] == 1) {
[self performSegueWithIdentifier:@"homeSeg3" sender:self];
}
}
-(void)viewDidUnload {
self.view.hidden = NO;
}
En mi opinión, la mejor estrategia para algo como esto es una pantalla de inicio de sesión que ya se presentó sobre el controlador de vista principal cuando se inicia la aplicación, y se descarta y desasigna luego de que el usuario inicia sesión. He encontrado que la mayoría de las soluciones sugeridas anteriormente (así como las sugerencias aquí: Mejores prácticas para la pantalla de inicio de sesión de Storyboard, manejo de borrado de datos al cerrar la sesión ) no lo hacen de forma elegante.
Después de experimentar un poco ayer, creo que la mejor manera de hacerlo es mediante el uso de controladores de vista infantil:
1. Elija el guión gráfico de su interfaz principal en Xcode tal como lo haría normalmente (no es necesario agregar nada a su aplicación).
2. Agregue lo siguiente a su controlador de vista principal en viewDidLoad
:
// If user is not logged in, show login view controller
if (!isLoggedIn) {
// Instantiate Login View Controller from storyboard
UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
UIViewController *loginVC = [mainSB instantiateViewControllerWithIdentifier:@"Login"];
// Set the Login View Controller''s frame
loginVC.view.frame = self.view.bounds;
// Add login screen as a subview and as a child view controller
[self.view addSubview:loginVC.view];
[self addChildViewController:loginVC];
[loginVC didMoveToParentViewController:self];
// Maintain a reference to the Login screen so we can dismiss it later
_loginVC = loginVC;
}
3. Después de que el usuario haya iniciado sesión, informe a su controlador de vista principal mediante el uso de notificaciones o un delegado. Luego puede animar la pantalla de inicio de sesión de la forma que desee. Aquí estoy usando una animación de disolución:
// Animate out the category chooser
[UIView animateWithDuration:0.2 animations:^{
// Dissolve the login screen away
[_loginVC.view setAlpha:0];
} completion:^(BOOL finished) {
// Remove login screen as a child view controller
[_loginVC willMoveToParentViewController:nil];
[_loginVC.view removeFromSuperview];
[_loginVC removeFromParentViewController];
// nil out property
_loginVC = nil;
}];
¡Y eso es! De esta manera, el controlador de vista principal siempre es el controlador de vista raíz de su ventana, la pantalla de inicio de sesión se desasigna luego de que el usuario inicia sesión, y no hay parpadeo cuando se presenta por primera vez la pantalla de inicio de sesión.