不支持导航控制器

在我的MainStoryBoard我想推一个viewController到detailView,但我得到这个错误:

NSInvalidArgumentException“,原因是:”不支持导航控制器“

我在storyboard上为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]; } } 

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

导航控制器应该呈现(通过presentViewController或者他们可以被添加为一个childViewController)和ViewControllers应该被推送。

当您谈论推动导航控制器时, 最有可能要呈现它。 但是,可能会有特定的情况,所以让我们从最简单的开始。

  1. 呈现 UINavigationController

这是最常见的方式,这是大多数情况下你想要做的。 UINavigationController不能被推送,只能用一个新的根视图控制器来呈现。

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

你在这里做什么,首先创build一个UINavigationController ,然后设置必要的UIViewController作为它的根控制器。


  1. 推送 UINavigationController

如果你有一个ViewController的层次结构,你需要推动包含导航的视图控制器 – 如果你把这个任务称为pushing navigation controller – 有一种方法来实现它:

** 1)推ViewController,包含UINavigationController

推送你的UINavigationController ,首先创build一个UIViewController的子类。 这将是您的UINavigationController及其内容的包装/容器类。

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

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

在你的容器(你刚刚实例化)的viewDidLoad ,只需添加如下所示的内容:

 MyNavController* myNav = [[MyNavController alloc] init]; [myNav willMoveToParentViewController:self]; myNav.view.frame = self.view.frame; //Set a frame or constraints [self.view addSubview:myNav.view]; [self addChildViewController: myNav]; [dealers didMoveToParentViewController:self]; 

你在这里做的是基本实例化你的导航控制器,并将它作为一个子控制器添加到你的包装。 而已。 你已经成功推送你的UINavigationController。 这种方法的好处还可以指定导航栏button。 界面看起来非常整齐。