执行 segue 丢失导航控制器
Posted
技术标签:
【中文标题】执行 segue 丢失导航控制器【英文标题】:Perform segue loses Navigation Controller 【发布时间】:2019-01-21 10:28:43 【问题描述】:我有一个 Show
类型 UIStoryboardSegue
和 abSegue
标识符。它从 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 - 你的故事板中的从A
到B
也是 在导航控制器层次结构中吗?它的“善良”是Show (e.g. Push)
?
这个最新的@DonMag 问题可能是这里的关键......您可能想给我们一个快速概述 UINavigationController → 如何链接到 A → 链接到 B... 也许通过提供您的故事板的屏幕截图。转场可能很棘手。
【参考方案1】:
使用
self.performSegue(withIdentifier: segueID, sender: self)
【讨论】:
我使用 Swift 3.3 版 这正是提问者正在做的事情,所以这并不能真正回答他们的问题【参考方案2】:请注意,当您通过 interfece builder 连接 segue 时,您必须指定 segue 的类型,您有多个选项:show
、present 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 后,当给搜索栏焦点时,导航栏隐藏
无法在选择搜索结果时执行 unwind segue - 导航堆栈将不会更新