ios - open - push view controller swift 4
Vista de inserciĆ³n desde el controlador de vista presentado en iOS (11)
En resumen : ¿Cómo puedo PushViewController desde Presented ViewController?
En breve :
Tengo MainViewController
, en el que tengo un botón al hacer clic en el botón, estoy presentando una vista llamada LoginViewController
.
En esta página ( LoginViewController
), nuevamente tengo el button
, al hacer clic en eso, trato de presionar mi controlador de vista (llamado HomeViewController
) que no empuja.
Aquí está mi fragmento de código,
MainViewController.m
- (IBAction)LoginClicked:(id)sender {
LoginViewController *vc = [[LoginViewController alloc] init];
[self presentViewController:vc animated:YES completion:nil];
}
LoginViewController.m
- (IBAction)buttonActionMethodOnLoginView:(id)sender{
NSLog(@"viewControllers %@",APPDELEGATE.nav.viewControllers);
//LoginViewController is not in this array
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
}
Pero no funcionó para mí. Además, imprimí a stack of view controllers
antes de pushed
, pero no tiene LoginViewController
. Entonces, sin agregar LoginViewController
en a stack of view controllers
, ¿cómo puedo HomeViewController
a HomeViewController
desde LoginViewController
?
Cuando me vuelvo a casa desde HomeViewController, entonces LoginViewController
debería abrirse ...
¿Es posible utilizar este único NavigationController
?
Nota: - Aquí, acabo de tomar un ejemplo usando Login, Home y Main ViewController. Pero quiero que en otras pantallas.
1) presentar un navigation controller with its
controlador de vista raíz configurado como controlador de vista.
- (IBAction)LoginClicked:(id)sender
{
LoginViewController *loginViewController = [LoginViewController alloc] init];
UINavigationController *navController = [UINavigationController alloc] initWithRootViewController:loginViewController];
[self presentViewController:navController animated:YES completion:nil];
}
- (IBAction)buttonActionMethodOnLoginView:(id)sender
{
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
}
Espero que funcione para usted.
Crear una instancia de UINavigationController
[[UINavigationController alloc] initWithRootViewController:[[LoginViewController alloc] init]]
Presente ese control de navegación y luego presione cualquier VC que desee.
El problema es que LoginViewController
no tiene un controlador de navegación. Entonces le das uno.
MainViewController.m
Cree un UINavigationController
, coloque LoginViewController
en la pila y presente el UINavigationController
.
- (IBAction)LoginClicked:(id)sender {
LoginViewController *vc = [[LoginViewController alloc] init];
UINavigationController = nav = [[UINavigationController alloc] init];
nav.viewControllers = @[vc];
[self presentViewController:nav animated:YES completion:nil];
}
LoginViewController.m
- (IBAction)buttonActionMethodOnLoginView:(id)sender{
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
}
Despedir
Llame a dismissViewControllerAnimated
en su MainViewController
.
Este es un código muy simple para el controlador de vista actual y el controlador de vista push.
- (IBAction)LoginClicked:(id)sender {
LoginViewController *objLogicVC = [LoginViewController alloc] init];
UINavigationController *navPresent = [UINavigationController alloc] initWithRootViewController:objLogicVC];
[self presentViewController:navPresent animated:YES completion:nil];
}
- (IBAction)buttonActionMethodOnLoginView:(id)sender{
HomeViewController *objHomeVC = [[HomeViewController alloc] init];
[self.navigationController pushViewController:objHomeVC animated:YES];
}
No se puede presionar desde un controlador de vista presentado. Te sugiero, debes mantener tu jerarquía de navegación.
Para eso, desde su MainViewController, debe presentar LoginViewController y debe pasar el controlador de navegación para el MainViewController.
- (IBAction)openLogin:(id)sender {
LoginViewController *loginVC = (LoginViewController *) [self.storyboard instantiateViewControllerWithIdentifier:@"login"];
[loginVC setReferencedNavigation:self.navigationController];
[self presentViewController:loginVC animated:YES completion:nil];
}
Luego, dentro de LoginViewController, debe presionar a HomeViewController de esta manera,
LoginViewController.h
@interface LoginViewController : UIViewController {
UINavigationController *refNavigationController;
}
- (void) setReferencedNavigation:(UINavigationController *)refNavCon;
LoginViewController.m
- (void) setReferencedNavigation:(UINavigationController *)refNavCon {
refNavigationController = refNavCon;
}
- (IBAction)openHome:(id)sender {
[self dismissViewControllerAnimated:YES completion:^{
UIViewController *homeVC = [self.storyboard instantiateViewControllerWithIdentifier:@"home"];
[refNavigationController pushViewController:homeVC animated:YES];
}];
}
Al hacer esto, se verá como si estuvieras presionando desde LoginViewController, pero en realidad estás presionando desde MainViewController.
Puede personalizar este enfoque para mantener la animación y la interfaz de usuario para este flujo.
Para Swift 3.0
Presente su controlador de vista como un nuevo controlador raíz.
let navController = UINavigationController.init(rootViewController: self.storyboard!.instantiateViewController(withIdentifier: "SignInViewController"))
self.present(navController, animated: true, completion: {})
Ahora presione su controlador de vista desde el controlador de vista presentado
self.show(self.storyboard!.instantiateViewController(withIdentifier: "SignUpViewController"), sender: self)
Tienes que presionar desde tu primerView ( MainViewController
), pero puedes usar la animación como PresentView
y DismissView
. Use el siguiente código para esto:
Para Push (en MainViewController
)
LoginViewController *VC = [[LoginViewController alloc]init];
CATransition* transition = [CATransition animation];
transition.duration = 0.3f;
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromTop;
[self.navigationController.view.layer addAnimation:transition
forKey:kCATransition];
[[[UINavigationController alloc] initWithRootViewController:VC] pushViewController:VC animated:NO];
//[self.navigationController pushViewController:VC animated:NO];
Para Pop (en LoginViewController
)
CATransition* transition = [CATransition animation];
transition.duration = 0.3f;
transition.type = kCATransitionReveal;
transition.subtype = kCATransitionFromBottom;
[self.navigationController.view.layer addAnimation:transition
forKey:kCATransition];
[self.navigationController popViewControllerAnimated:NO];
Usando este código, puede obtener la misma animación que Present-Dismiss ViewControllers
. Consulte esta respuesta para más detalles.
Y después de eso, puedes usar tu código para Pushing
LoginViewController
en HomeViewController
Espero, esto es lo que estás buscando. Cualquier inquietud vuelve a llamarme. :)
hola cuando estás presentando el controlador de la vista de inicio de sesión Solo presenta un controlador de navegación como:
LoginVC *loginVCObj =[[LoginVC alloc]initWithNibName:@"LoginVC" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:loginVCObj];
[self presentViewController:nav animated:YES completion:nil];
Ahora su PresentedViewController es un controlador de navegación ahora puede simplemente presionar a su VC de inicio
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
Espero que te sea de utilidad
simplemente ponga este código en el objetivo c en la acción del botón
UIViewController *yourViewControllerName = [self.storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerName "];
[[self navigationController] pushViewController:yourViewControllerName animated:YES];
LoginViewController
no debe colocarse en la pila del controlador de navegación. Déjame describir a continuación "por qué".
Nuestro MainViewController
debe estar en la pila, siempre querrá volver allí.
// AppDelegate.m (only if you don''t use storyboards, if you do - you don''t need to copy this part of code)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// create the window
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window setBackgroundColor:[UIColor whiteColor]];
[self.window makeKeyAndVisible];
// set view controllers
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:[[MainViewController alloc] init]];
[self.window setRootViewController:navigationController];
}
En la acción específica, muestra LoginViewController
. No desea que el usuario pueda volver a tocar e ir a MainViewController
. Más adelante, no querrá que el usuario vuelva a LoginViewController
. Debido a esto, necesitas presentarlo como modal:
// inside `MainViewController.m`
- (IBAction)myCoolActionToShowLogin:(id)sender {
[self presentViewController:[[LoginViewController alloc] init] animated:YES completion:nil];
}
Ahora podemos ver LoginViewController
. Cuando el usuario complete el inicio de sesión, descártelo y presente HomeViewController
:
// inside `LoginViewController.m`
- (IBAction)myAwesomeActionToShowHome:(id)sender {
UINavigationController *navigationController = (UINavigationController *)[UIApplication.sharedApplication.keyWindow rootViewController];
[navigationController pushViewController:[[HomeViewController alloc] init] animated:YES];
[self dismissViewControllerAnimated:YES completion:nil];
}
NOTAS:
Como puede observar, myAwesomeActionToShowHome:
espera que tenga un controlador de navegación como su controlador de control de rootViewController
. Esto funciona, pero debería ser más agradable: debe comprobar si esa navegación es en realidad un controlador de navegación en lugar de lanzarlo. O puede crear un delegado o bloque para empujar uno nuevo. Esta es la solución de trabajo más rápida y fácil, que se debe mejorar más adelante.
Debería leer la documentación de Apple Developer -> "View Controller Programming" , ya que estos son los fundamentos básicos que debe conocer para desarrollar y diseñar UX correctamente.
Aquí está la muestra de demostración de trabajo.
MainViewController.m
- (IBAction)LoginClicked:(id)sender {
LoginViewController *vc = [[LoginViewController alloc] init];
UINavigationController *loginNav = [[UINavigationController alloc] initWithRootViewController:vc];
[self presentViewController:loginNav animated:YES completion:nil];
}
LoginViewController.m
- (IBAction)buttonActionMethodOnLoginView:(id)sender{
NSLog(@"viewControllers %@",APPDELEGATE.nav.viewControllers);
//LoginViewController is not in this array
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
}