Pushing a navigation controller is not supported

后端 未结 2 361
心在旅途
心在旅途 2020-12-02 19:51

In my MainStoryBoard I want to push a viewController to the detailView but I get this error:

NSInvalidArgumentException\', reason: \'Pushing a naviga

相关标签:
2条回答
  • 2020-12-02 20:25

    Like rmaddy said in the comments you are trying to push a navigation controller.

    Navigation controllers should be presented (via presentViewController or they can be added as a childViewController) and ViewControllers should be pushed.

    0 讨论(0)
  • 2020-12-02 20:32

    When you talk about pushing Navigation Controller, it is most likely that you want to present it.

    1. Presenting UINavigationController

    This is the most common way and this is what you want to do in most cases. UINavigationController cannot be pushed, it can only be presented with a new root View Controller.

    MyViewController* vc = [[MyViewController alloc]
          initWithNibName:@"MyController" bundle:nil];
    
    UINavigationController *myNav = [[UINavigationController alloc] initWithRootViewController: vc];
    
    [self presentViewController:myNav animated:YES completion:nil];
    

    What you do here, is firstly create a UINavigationController and then set necessary UIViewController as its root controller.


    1. Pushing UINavigationController

    If you have a hierarchy of ViewControllers and you need to push view controller that contains navigation controller within, steps are:

    1) Push ViewController, containing UINavigationController.

    To push UINavigationController, first create a subclass of UIViewController, which will be a wrapper-/container- class for your UINavigationController and its content.

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

    2) Adding UINavigationController as a child view controller

    In viewDidLoad of your container (that you have just instantiated) simply add something like this:

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

    What you do here is basically instantiate your navigation controller and add it as a child controller to your wrapper. That's it. You have successfully pushed your UINavigationController.

    0 讨论(0)
提交回复
热议问题