69

在我的 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];
    }
}
4

2 回答 2

49

就像rmaddy在评论中所说的那样,您正在尝试推送导航控制器。

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

于 2014-10-30T15:14:03.217 回答
33

当你谈到推送Navigation Controller 时,很可能你想呈现它。

  1. 呈现UINavigationController

这是最常见的方式,也是您在大多数情况下想要做的。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

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

1) 推送 ViewController,包含UINavigationController.

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

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

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

斯威夫特 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。

于 2017-10-25T09:29:02.003 回答