poptoviewcontroller ios uinavigationcontroller pushviewcontroller popviewcontroller

ios - poptoviewcontroller



apareciendo y empujando los controladores de vista en la misma acción (7)

En Swift:

let newVc = UIViewController() var vcArray = self.navigationController?.viewControllers vcArray!.removeLast() vcArray!.append(newVc) self.navigationController?.setViewControllers(vcArray!, animated: false)

En caso de que newVc exista en un Storyboard:

let storyboard = UIStoryboard(name: "Main", bundle: nil) let newVc = storyboard.instantiateViewControllerWithIdentifier("YourViewControllerIdentifier") as! UIViewController var vcArray = self.navigationController?.viewControllers vcArray!.removeLast() vcArray!.append(newVc) self.navigationController?.setViewControllers(vcArray!, animated: false)

¿Es posible sacar una vista de la pila de navegación y luego presionar otra directamente sobre ella?

Estoy tratando de implementar una jerarquía plana para esta sección y me gustaría tener un controlador segmentado, pero no puedo hacer que el controlador segmentado se vea como me gusta, por lo tanto, estoy intentando usar el controlador de navegación.

Cuando se hace clic en un botón, ejecuto este código:

[[self navigationController] popViewControllerAnimated:YES]; MapsViewController *aViewController = [[MapsViewController alloc] initWithNibName:@"MapsViewController" bundle:nil]; [self.navigationController pushViewController:aViewController animated:NO]; [aViewController release];

Está saliendo bien, ¡pero no hay signos de empujar! Cualquier ayuda sería apreciada.


Puede usar este código para abrir o presionar su controlador.

Para objetivo c

bool alreadyPushed = false; //Check if the view was already pushed NSMutableArray *viewControllers; if ( (viewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers])) { for (UIViewController *aViewController in viewControllers) { if ([aViewController isKindOfClass:[YourControllerName class]]) { NSLog(@"pop your view controller"); [self.navigationController popToViewController:aViewController animated:YES]; alreadyPushed = true; break; } } } //Push Fresh View if( alreadyPushed == false) { NSLog(@"push your view controller"); YourControllerName *YourControllerObject = [[YourControllerName alloc]initWithNibName:@"YourNibName" bundle:nil]; [self.navigationController pushViewController:YourControllerObject animated:YES]; }

Para Swift

var alreadyPushed = false //Check if the view was already pushed if let viewControllers = self.navigationController?.viewControllers { for viewController in viewControllers { if let viewController = viewController as? YourControllerName { self.navigationController?.popToViewController(viewController, animated: true); print(" Push Your Controller") alreadyPushed = true break } } } if alreadyPushed == false { let YourControllerObject = self.storyboard?.instantiateViewControllerWithIdentifier("YourControllerIdentifire") as! YourControllerName self.navigationController?.pushViewController(YourControllerObject, animated: true) }


Tomado de la solución de https://.com/users/1619554/tomer-peled , para que otros puedan encontrarlo más fácilmente.

Esta parece ser la mejor manera de hacerlo para iOS8:

UIViewController *newVC = [[UIViewController alloc] init]; // Replace the current view controller NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[[self navigationController] viewControllers]]; [viewControllers removeLastObject]; [viewControllers addObject:newVC]; [[self navigationController] setViewControllers:viewControllers animated:YES];


Swift 3.0

En caso de que alguien quiera profundizar en la jerarquía de vistas:

//Go back to desired viewController and then push another viewController var viewControllers = self.navigationController!.viewControllers while !(viewControllers.last is MyViewControllerClass) { viewControllers.removeLast() } // go to new viewController let anotherViewController = AnotherViewController(nibName: "AnotherViewController", bundle: nil) viewControllers.append(anotherViewController) self.navigationController?.setViewControllers(viewControllers, animated: true)


Swift 4:

self.navigationController.setViewControllers[].. no funcionó para mí. Pero puedo resolver el problema manteniendo un controlador de navegación en una variable de instancia y hacer una operación push / pop. Por lo tanto, silenciosamente capaz de cambiar el controlador sin falla.

let navigationVC = self.navigationController navigationVC?.popViewController(animated: false) navigationVC?.pushViewController(myNewVC, animated: false)


MapsViewController *aViewController = [[MapsViewController alloc] initWithNibName:@"MapsViewController" bundle:nil]; // locally store the navigation controller since // self.navigationController will be nil once we are popped UINavigationController *navController = self.navigationController; // retain ourselves so that the controller will still exist once it''s popped off [[self retain] autorelease]; // Pop this controller and replace with another [navController popViewControllerAnimated:NO];//not to see pop [navController pushViewController:aViewController animated:YES];//to see push or u can change it to not to see.

O

MapsViewController *aViewController = [[MapsViewController alloc] initWithNibName:@"MapsViewController" bundle:nil]; UINavigationController *navController = self.navigationController; //Get all view controllers in navigation controller currently NSMutableArray *controllers=[[NSMutableArray alloc] initWithArray:navController.viewControllers] ; //Remove the last view controller [controllers removeLastObject]; //set the new set of view controllers [navController setViewControllers:controllers]; //Push a new view controller [navController pushViewController:aViewController animated:YES];


BOOL Present = NO; fifthViewController * fifthVC = [self.storyboard instantiateViewControllerWithIdentifier:@"homeController"]; for (UIViewController* viewController in self.navigationController.viewControllers) { //This if condition checks whether the viewController''s class is MyGroupViewController // if true that means its the MyGroupViewController (which has been pushed at some point) if ([viewController isKindOfClass:[fifthViewController class]] ) { // Here viewController is a reference of UIViewController base class of MyGroupViewController // but viewController holds MyGroupViewController object so we can type cast it here fifthViewController *groupViewController = (fifthViewController*)viewController; [self.navigationController popToViewController:groupViewController animated:NO]; Present=YES; } } if(Present==NO) { [self PushAnimation]; [self.navigationController pushViewController:fifthVC animated:NO]; Present=YES; }