Swift 3 - 将segue推送到导航控制器

use*_*331 8 swift swift3

在我的故事板中,我有一个View Controller,我还有一个导航控制器和另一个名为HistoryController的View Controller.导航控制器和HistroyController有一个关系"根视图控制器"

我的第一个视图控制器上有一个按钮,该按钮有一个推送到导航控制器的按钮.

我在第一个视图控制器中有这个代码来准备segue:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if let viewController = segue.destination as? HistoryController {
            viewController.detailItem = barcodeInt as AnyObject
        }

    }
Run Code Online (Sandbox Code Playgroud)

我的问题是当我运行我的代码并按下我的第一个控制器中的按钮时,我收到此错误:

Could not find a navigation controller for segue 'HistorySegue'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.'
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么我会收到此错误,我该如何解决?

我尝试了以下内容

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let navVC = segue.destinationViewController as? UINavigationController{
            if let historyVC = navVC.viewControllers[0] as? HistoryController{
                historyVC.detailItem = barcodeInt as AnyObject
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我也试过了

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let nav = segue.destination as? UINavigationController {
        if let vc = nav.visibleViewController as? HistoryController {
            vc.detailItem = barcodeInt as AnyObject
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我仍然得到同样的错误:

Could not find a navigation controller for segue 'HistorySegue'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.'
Run Code Online (Sandbox Code Playgroud)

Geo*_*rna 10

您需要将源视图控制器嵌入到导航控制器中,或者将segue类型从推送更改为其他类型.另外,尝试将目标控制器转换为UINavigationController,以防止在初始控制器之后出现另一个错误(如果已修复):

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let navVC = segue.destinationViewController as? UINavigationController{
            if let historyVC = navVC.viewControllers[0] as? HistoryController{
                historyVC.detailItem = barcodeInt as AnyObject
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

看看它是否适合你.

编辑:更新了上面的代码.