不支持推送导航控制器

时间:2013-07-19 23:39:12

标签: ios objective-c swift uinavigationcontroller storyboard

在我的MainStoryBoard中,我想将viewController推送到detailView,但是我收到了这个错误:

  

NSInvalidArgumentException',原因:'不支持推送导航控制器'

我在故事板上为viewController设置了标识符'JSA'ID。

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

2 个答案:

答案 0 :(得分:38)

就像rmaddy在评论中所说的那样,你试图推动导航控制器。

应该呈现导航控制器(通过presentViewController或者它们可以作为childViewController添加)并且应该推送ViewControllers。

答案 1 :(得分:15)

当您谈到推送导航控制器时,您想要呈现它

  1. 演示 UINavigationController
  2. 这是最常见的方式,这是您在大多数情况下想要做的事情。 UINavigationController无法推送,只能使用新的根视图控制器。

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

    您在此处执行的操作,首先是创建UINavigationController,然后将必要的UIViewController设置为其根控制器。

    1. 推送 UINavigationController
    2. 如果您有ViewControllers层次结构,并且需要推送包含导航控制器的视图控制器,则步骤为:

      1)推送ViewController,其中包含UINavigationController

      推送 UINavigationController,首先要创建一个UIViewController的子类,它将是UINavigationController及其内容的包装器/容器类。

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

      2)将UINavigationController添加为子视图控制器

      在容器的viewDidLoad中(您刚刚实例化)只需添加如下内容:

      <强>目标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)
      

      你在这里做的基本上是实例化导航控制器并将其作为子控制器添加到你的包装器。而已。您已成功推送您的UINavigationController。