如何以编程方式显示/推送导航控制器

Posted

技术标签:

【中文标题】如何以编程方式显示/推送导航控制器【英文标题】:How to show/push a navigation controller programatically 【发布时间】:2015-02-24 14:44:39 【问题描述】:

使用情节提要,我可以让控制器向导航控制器显示/推送 segue。然后,新的导航控制器会将 navigationController 设置为现有的导航控制器,并且新导航控制器的视图控制器会将新的导航控制器作为其导航控制器。如果我尝试以编程方式推送导航控制器,它会失败。是否有任何编程方式来修改导航控制器的视图控制器,以便它们可以包含导航控制器?以下将不起作用:

let aNavigationController = UIStoryboard(name: "OurStoryBoard", bundle: nil).instantiateViewControllerWithIdentifier("OurNavigationController") as OurNavigationController

navigationController!.pushViewControll(aNavigationController, animated: true)

【问题讨论】:

我认为您的意思可能是“程序化”而不是“务实”。您能否展示您尝试过的代码并描述您无法解决的特定问题?这个问题目前太模糊了。 用 var 交换 let。你有什么错误吗? NickCatib,没有效果。视图控制器和苹果库提供的大多数东西都是类而不是结构。 let 关键字只是意味着它不能被重新分配。它仍然可以变异。 我开始认为推送导航控制器可能是一种糟糕的形式,即使苹果出于某种原因允许您通过情节提要来做到这一点。我假设他们使用了某种我们无法访问的私有 API。 【参考方案1】:

NavigationController 不会相互推动。您可以将 NavigationController 替换为另一个,但这不会涉及“推送”动画。

但是,您可以在同一个导航控制器上设置不同的视图控制器并制作动画。这些将替换导航控制器中现有的视图控制器。这是一个推送一个视图控制器并替换导航控制器内现有视图控制器的示例:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewControllerOne *vc1 = [storyboard instantiateViewControllerWithIdentifier:@"ViewControllerOne"];
NSMutableArray *controllers = [NSMutableArray array];
[controllers addObject:vc1];
[yourAppNavigationController setViewControllers:controllers animated:YES];

如果你想用多个视图控制器替换当前视图控制器:

// 1.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
FirstViewController *vc1 = [storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"];
SecondViewController *vc2 = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
ThirdViewController *vc3 = [storyboard instantiateViewControllerWithIdentifier:@"ThirdViewController"];

// 2.
NSMutableArray *controllers = [NSMutableArray array];
[controllers addObject:vc1];
[controllers addObject:vc2];
[controllers addObject:vc3];

// 3.
[yourAppNavigationController setViewControllers:controllers animated:YES];

同样,这涉及到您可能正在寻找的“推送”动画,它替换了现有的视图控制器,因此不会出现不需要的后退按钮(在第一个带有 VC 的代码示例中)。

【讨论】:

以上是关于如何以编程方式显示/推送导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式推送时导航栏消失

iOS Swift 从推送通知以编程方式导航到某些 ViewController

以编程方式显示到控制器的导航

如何通过以编程方式创建导航控制器 POP 以查看控制器

无法从以编程方式创建的 UINavigationController 推送

如何向在 tabcontroller 中以编程方式创建的导航控制器中的 barbuttonitem 添加操作