present open change ios objective-c uinavigationcontroller pushviewcontroller presentviewcontroller

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]; }