执行 segue 丢失导航控制器

Posted

技术标签:

【中文标题】执行 segue 丢失导航控制器【英文标题】:Perform segue loses Navigation Controller 【发布时间】:2019-01-21 10:28:43 【问题描述】:

我有一个 Show 类型 UIStoryboardSegueabSegue 标识符。它从 UIViewController A 导航到 B

在整个应用程序中,我使用了自定义 UINavigationController,它工作得非常好,但在这里却不行。

使用self.performSegue(id: "abSegue", sender: self) 会导致UINavigationController 丢失,但使用

let controller = UIStoryboard(name: "Storyboard", bundle: bundle).instantiateViewController(withIdentifier: "B")
navigationController?.pushViewController(controller)

工作正常,我收到了预期的UINavigationController

什么会导致这种行为?

【问题讨论】:

在你的故事板中,A 是导航控制器的根 VC,还是至少通过 segues 连接到导航控制器? @DonMag 是的,它是 OK - 你的故事板中的从AB 也是 在导航控制器层次结构中吗?它的“善良”是Show (e.g. Push)? 这个最新的@DonMag 问题可能是这里的关键......您可能想给我们一个快速概述 UINavigationController → 如何链接到 A → 链接到 B... 也许通过提供您的故事板的屏幕截图。转场可能很棘手。 【参考方案1】:

使用

self.performSegue(withIdentifier: segueID, sender: self)

【讨论】:

我使用 Swift 3.3 版 这正是提问者正在做的事情,所以这并不能真正回答他们的问题【参考方案2】:

请注意,当您通过 interfece builder 连接 segue 时,您必须指定 segue 的类型,您有多个选项:showpresent modally 等。为了将控制器推送到导航,您应该为 segue 类型选择 show(或 push 用于以前版本的 swift),否则它将以模态方式显示控制器

【讨论】:

【参考方案3】:

尝试像这样指定UIViewController

let storyboard = UIStoryboard(name: "Storyboard", bundle: bundle)
let vcB = searchStoryboard.instantiateViewController(withIdentifier: "B") as! ViewControllerB // or the name of your `UIViewController`
self.navigationController?.pushViewController(vcB, animated: true)

【讨论】:

以上是关于执行 segue 丢失导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

执行 push segue 后,当给搜索栏焦点时,导航栏隐藏

IOS:推送segue后导航栏消失

无法在选择搜索结果时执行 unwind segue - 导航堆栈将不会更新

如何从流程中间执行导航 [segue] + ios 应用程序

模态 Segue 进入没有导航栏的导航控制器

从 UIPageViewController 的根视图控制器执行 Segue