Ios 不支持推送导航控制器

Ios 不支持推送导航控制器,ios,objective-c,swift,uinavigationcontroller,storyboard,Ios,Objective C,Swift,Uinavigationcontroller,Storyboard,在我的MainstryBoard中,我想将viewController推送到detailView,但出现以下错误: NSInvalidArgumentException',原因:“不支持推送导航控制器” 我在故事板上为viewController设置了标识符“JSA”ID - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.r

在我的MainstryBoard中,我想将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];
    }
}
正如在评论中所说的,您正在尝试推送导航控制器


应显示导航控制器(通过presentViewController或将其添加为childViewController)并按下ViewController。

当您谈论按下导航控制器时,您最有可能要显示它

  • 显示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
    设置为其根控制器

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

  • 推送UINavigationController
  • 如果您有一个ViewController层次结构,并且需要推送包含导航控制器的view controller,步骤如下:

    1)推送视图控制器,包含
    UINavigationController

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

    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。

    您必须推送视图控制器,而不是另一个导航控制器。如果你真的想显示另一个导航控制器,你需要展示它,而不是推送它。非常感谢,错误已经消失,但它会转到tableViewController,我想在细节上显示它,谢谢看一看这个线程(我得到了一个对我有用的答案,但也许其他人中的一个会帮你做这个把戏。)就像maddy说的,这会引发“不支持推送导航控制器”的异常。您必须[self-presentViewController:viewController动画:是完成:无];另外,请确保您在viewcontroller中输入了情节提要标识符,而不是在NavigationController中。这是一个更全面的答案,它解决了支持分层导航控制器而无需模式表示的需要。应该是最上面的答案。嵌入式导航控制器中的UINavigationItem存在问题。您无法轻松添加条形按钮。问题是使用了来自父级的原始导航项,因此您必须像访问父级一样访问它。navigationItem…。从视图控制器的可重用性来看,这是非常糟糕的。@是的,有一个问题。但您可以通过隐藏父导航栏和管理固有的navigationItem来处理它。从用户界面的角度来看,这看起来是一样的,但这并不是那么容易。如果隐藏父导航栏,则无法使用“系统后退”按钮。因此,您必须在子导航栏中添加自定义后退按钮,这与通过其父导航栏调用导航项一样难看。
    MyViewController* vc = [[MyViewController alloc]
          initWithNibName:@"MyController" bundle:nil];
    
    UINavigationController *myNav = [[UINavigationController alloc] initWithRootViewController: vc];
    
    [self presentViewController:myNav animated:YES completion:nil];