不支持推送导航控制器

Jos*_*ose 52 objective-c storyboard uinavigationcontroller ios swift

在我的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];
    }
}
Run Code Online (Sandbox Code Playgroud)

Tia*_*ida 41

就像rmaddy在评论中所说,你正试图推动导航控制器.

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


Hex*_*ire 24

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

  1. 介绍 UINavigationController

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

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

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

[self presentViewController:myNav animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

你在这里做的是首先创建一个UINavigationController然后设置必要UIViewController的根控制器.


  1. 推动 UINavigationController

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

1)推送ViewController,包含UINavigationController.

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

ContainerViewController* vc = [[ContainerViewController alloc] init];
Run Code Online (Sandbox Code Playgroud)

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

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

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];
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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