est-il possible de faire apparaître une vue de la pile de navigation, puis d'insérer une autre droite dessus?
J'essaie d'implémenter une hiérarchie horizontale pour cette section et j'aimerais disposer d'un contrôleur segmenté, mais je ne peux pas donner au contrôleur segmenté l'apparence que je veux, d'où la raison pour laquelle j'essaie d'utiliser le contrôleur de navigation.
Quand un bouton est cliqué, j'ai exécuté ce code:
[[self navigationController] popViewControllerAnimated:YES];
MapsViewController *aViewController = [[MapsViewController alloc]
initWithNibName:@"MapsViewController" bundle:nil];
[self.navigationController pushViewController:aViewController animated:NO];
[aViewController release];
Ça se passe bien mais il n'y a aucun signe de poussée! Toute aide serait appréciée.
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.
Ou
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];
Tiré de https://stackoverflow.com/users/1619554/tomer-peled , afin que d'autres puissent le trouver plus facilement.
Cela semble être le meilleur moyen de le faire pour 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];
En rapide:
let newVc = UIViewController()
var vcArray = self.navigationController?.viewControllers
vcArray!.removeLast()
vcArray!.append(newVc)
self.navigationController?.setViewControllers(vcArray!, animated: false)
Si newVc existe dans 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)
Swift 4:
self.navigationController.setViewControllers[]..
n'a pas fonctionné pour moi. Mais je peux résoudre le problème en tenant un contrôleur de navigation dans une variable d'instance et en effectuant une opération Push/Pop. Ainsi, silencieusement capable de changer de contrôleur sans problème.
guard let navigationVC = self.navigationController else { return }
navigationVC.popViewController(animated: false)
navigationVC.pushViewController(myNewVC, animated: false)
Vous pouvez utiliser ce code pour faire apparaître ou pousser votre contrôleur.
Pour l'objectif 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];
}
Pour 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
Au cas où quelqu'un voudrait aller au fond de la hiérarchie:
//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)