web-dev-qa-db-fra.com

Pousser un contrôleur de navigation n'est pas pris en charge

Dans mon MainStoryBoard, je veux pousser un viewController vers le detailView mais j'obtiens cette erreur:

NSInvalidArgumentException ', raison:' Pousser un contrôleur de navigation n'est pas pris en charge '

J'ai défini l'identifiant 'JSA' ID pour le viewController sur le storyboard.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) {
        SWSJSAViewController *viewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"JSA"];
        [self.navigationController pushViewController:viewController animated:YES];
    }
}
46
Jose

Comme rmaddy dit dans les commentaires que vous essayez de pousser un contrôleur de navigation.

Les contrôleurs de navigation doivent être présentés (via presentViewController ou ils peuvent être ajoutés en tant que childViewController) et ViewControllers doivent être poussés.

40
Tiago Almeida

Lorsque vous parlez de pousser contrôleur de navigation, c'est le plus probable que vous souhaitez présenter .

  1. Présentation UINavigationController

C'est le moyen le plus courant et c'est ce que vous voulez faire dans la plupart des cas. UINavigationController ne peut pas être poussé, il ne peut être présenté qu'avec un nouveau contrôleur de vue racine.

MyViewController* vc = [[MyViewController alloc]
      initWithNibName:@"MyController" bundle:nil];

UINavigationController *myNav = [[UINavigationController alloc] initWithRootViewController: vc];

[self presentViewController:myNav animated:YES completion:nil];

Ce que vous faites ici, c'est tout d'abord créer un UINavigationController puis définissez nécessaire UIViewController comme contrôleur racine.


  1. Poussée UINavigationController

Si vous avez une hiérarchie de ViewControllers et que vous devez pousser le contrôleur de vue qui contient le contrôleur de navigation, les étapes sont les suivantes:

1) Appuyez sur ViewController, contenant UINavigationController.

Pour Appuyez sur UINavigationController, créez d'abord une sous-classe de UIViewController, qui sera une classe wrapper-/container- pour votre UINavigationController et son contenu.

ContainerViewController* vc = [[ContainerViewController alloc] init];

2) Ajout de UINavigationController comme contrôleur de vue enfant

Dans viewDidLoad de votre conteneur (que vous venez d'instancier), ajoutez simplement quelque chose comme ceci:

Objectif-C

UINavigationController* myNav = [[UINavigationController alloc] initWithRootViewController: rootViewController];
[myNav willMoveToParentViewController:self];

myNav.view.frame = self.view.frame;  //Set a frame or constraints
[self.view addSubview:myNav.view];
[self addChildViewController: myNav];
[myNav didMoveToParentViewController:self];

Swift 4.2 +

let childNavigation = UINavigationController(rootViewController: viewController)
childNavigation.willMove(toParent: self)
addChild(childNavigation)
childNavigation.view.frame = view.frame
view.addSubview(childNavigation.view)
childNavigation.didMove(toParent: self)

Ce que vous faites ici, c'est essentiellement instancier votre contrôleur de navigation et l'ajouter en tant que contrôleur enfant à votre wrapper. C'est ça. Vous avez réussi à pousser votre UINavigationController.

20
Hexfire