在相同的动作中popup并推送视图控制器

是可以popup一个视图closures导航堆栈,然后再推直到它?

我试图实现这个部分的平面层次结构,并希望有一个分段控制器,但我不能让分段控制器看起来像我想要的东西,因此,我试图使用导航控制器。

当一个button被点击时,我执行这个代码:

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

它popupOK,但没有任何推动的迹象! 任何帮助,将不胜感激。

  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. 

要么

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

采取从https://stackoverflow.com/users/1619554/tomer-peled的解决scheme,所以其他人可以更容易地find它。

这似乎是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中:

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

在故事板中存在newVc的情况下:

 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) 

您可以使用此代码来popup或推动您的控制器。

对于目标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]; } 

对于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) } 
 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; } 

Swift 3.0

如果有人想深入查看层次结构:

  //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)