如何在 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

如何使用 prepareForSegue 方法从视图控制器推送到导航视图控制器?

使用 prepareForSegue 设置方法值

Swift:如何在 UICollectionViewCell 中使用“prepareForSegue”?