如何在 prepareForSegue 中嵌入 UINavigationController?
Posted
技术标签:
【中文标题】如何在 prepareForSegue 中嵌入 UINavigationController?【英文标题】:How to embed a UINavigationController in prepareForSegue? 【发布时间】:2017-04-01 03:09:46 【问题描述】:目前我有一个 UITableViewController
类型的 VC1
嵌入在 UINavigationController
中。当用户选择一个单元格时,它会执行push
segue 到VC2
也是UITableViewController
类型。这很好,因为导航栏仍然存在。
但是在VC1
中,导航栏中有一个UIBarButtonItem
,点击它后,它也会转到VC2
并执行不同的操作,但它使用所有相同的菜单布局。
使用UIBarButtonItem
segue 到VC2
,我喜欢执行modal
segue 来区分这两个动作。
我知道modal
segues 涵盖了整个屏幕,并且所有顶部栏都将被删除。
我关注了这个问题:Modal segue, navigation bar dissapears
提供的answers 之一展示了如何在prepareForSegue
中嵌入UINavigationController
,因此我遵循并实现了:
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if segue.identifier == "AddSegue"
let navigationController: UINavigationController = segue.destination as! UINavigationController
var addVC: VC2 = VC2()
addVC = navigationController.viewControllers[0] as! VC2
但是,我得到了错误:
无法将“VC2”类型的值转换为 'UINavigationController'
我怎样才能在prepareForSegue
中正确嵌入UINavigationController
,因为我需要在不同的视图控制器之间传递数据。
这是我的故事板:
【问题讨论】:
【参考方案1】:您要相交的 segue 是您的 VC2
,而不是导航控制器。您将需要更新"AddSegue"
segue 以指向导航控制器,然后将您的VC2
链接为导航控制器的根视图控制器。
如果您发布故事板,我可以为您提供有关如何执行此操作的更多详细信息。
编辑:这是您应该如何设置情节提要的方法。可能有点奇怪,因为 VC2 有两个父导航控制器,但应该没问题。
【讨论】:
这如何帮助我在保持导航栏的同时执行 2 种不同类型的 segue? 您没有维护原始导航栏。当您以模态方式呈现 VC2 时,您实际上是在创建另一个导航堆栈(并且不将其嵌入导航控制器中,堆栈将始终具有 1 个视图控制器并且没有栏)。我添加的第二个导航控制器应该以模态方式呈现,从而为您提供 VC2 的导航栏。 如果不使用情节提要嵌入另一个导航控制器,就没有办法以编程方式进行吗? 不是您尝试的方式。您不能在 segue 期间更改目标视图控制器,并且您的 segue 直接连接到 VC2。以上是关于如何在 prepareForSegue 中嵌入 UINavigationController?的主要内容,如果未能解决你的问题,请参考以下文章
如果我使用 prepareForSegue 传递数据,则无法嵌入导航控制器
Swift:使用 prepareForSegue 将 UIView 容器的高度设置为嵌入式 UITableView 的高度
将选项卡栏控制器嵌入导航控制器时的 prepareForSegue