ios - tutorial - swift(lenguaje de programación)
SWRevealViewController: ¿cambiar manualmente a otra vista? (7)
Tengo un menú de barra lateral, hecho con SWRevealViewController.
Uno de los elementos del menú en la barra lateral es "iniciar sesión". Abre la vista de inicio de sesión (a través de segue SWRevealViewController personalizado)
Quiero cambiar a otra vista mediante programación después de que el usuario inicie sesión correctamente. ¿Cómo hago eso?
ACTUALIZACIÓN , mi código:
ViewController *vc = [[ViewController alloc] init]; // this is main front ViewController
SWRevealViewController *revealController = self.revealViewController;
[revealController setFrontViewController:vc animated:YES];
Después de esto me sale la pantalla vacía. ¿Qué estoy haciendo mal? Siento que esto está mal:
ViewController *vc = [[ViewController alloc] init];
Entonces, ¿cuál es la forma correcta de acceder al controlador de vista ya cargado? (se carga al inicio de la aplicación por SWRevealViewController como controlador frontal)
@Evana tiene una buena respuesta, sin embargo, para mi caso, que pasa el parámetro al destViewController, debo mejorarlo como se muestra a continuación. Al seguir su ejemplo exactamente, noté que se llamó dos veces al viewDidLoad de DestViewController. Primero con 0 en el ''selectedId'', solo en la segunda llamada el ''selectedId'' está recibiendo mi valor de etiqueta.
Por lo tanto, para una navegación más limpia, el DestViewController se debe obtener del navController, para que no haya una llamada redundante.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *navController = [storyboard instantiateViewControllerWithIdentifier:@"DestNavController"];
DestViewController *destViewController = (DestViewController*)[[navController viewControllers] objectAtIndex:0];
destViewController.selectedId = ((UIButton*)sender).tag;
[self.revealViewController setFrontViewController:navController];
Aquí hay una versión Swift de la solución setFrontViewController:
if let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("SecondViewControllerStoryBoardID") as? SecondViewController {
let navController = UINavigationController(rootViewController: secondViewController)
navController.setViewControllers([secondViewController], animated:true)
self.revealViewController().setFrontViewController(navController, animated: true)
}
Esta me funciona perfectamente.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
UINavigationController *navController = [storyboard instantiateViewControllerWithIdentifier:@"NavController"];
[navController setViewControllers: @[rootViewController] animated: YES];
[self.revealViewController setFrontViewController:navController];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
Hay una nueva API - (void)pushFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated;
Por lo que sé, esta es la forma más elegante que anima correctamente para cambiar manualmente entre los controladores de vista.
// get the view controller you want to push to properly.
// in this case, I get it from Main.storyboard
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController * vc = [sb instantiateViewControllerWithIdentifier:@"SignInViewController"];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vc];
[navController setViewControllers: @[vc] animated:NO];
[self.revealViewController pushFrontViewController:navController animated:YES];
Si está en el vc de destino que no importa SWRevealViewController
y desea hacer retroceder:
// get your vc properly
[self.navigationController setViewControllers:@[vc] animated:YES];
Tenga en cuenta que [self.navigationController showViewController:vc sender:self];
tiene el mismo resultado, pero no use esto ya que crea un nuevo controlador de vista en la pila de navegación, que básicamente carece de sentido al usar SWRevealViewController
.
Prueba esto:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SecondViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
[navController setViewControllers: @[rootViewController] animated: YES];
[self.revealViewController setFrontViewController:navController];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
trabaja para mi :-)
Prueba esto:
ViewController *vc = [[ViewController alloc] init]; // this is main front ViewController
UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
[navController setViewControllers: @[vc] animated: YES];
// [navController pushViewController:vc animated:YES]; // use this if you want to stack the views
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
Utilice - (void)setFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated;
método
SWRevealController tiene su propia propiedad a la que puede acceder desde cualquier UIViewController:
SWRevealViewController *revealController = self.revealViewController;
Puede consultar proyectos de ejemplo en su repositorio de GitHub: https://github.com/John-Lluch/SWRevealViewController