如何在 Swift 中通过 Segue 将数据传递到下一个视图?

Posted

技术标签:

【中文标题】如何在 Swift 中通过 Segue 将数据传递到下一个视图?【英文标题】:How to pass the data to next View via Segue in Swift? 【发布时间】:2016-08-10 01:08:39 【问题描述】:

我正在使用 Swift 进行开发。

下面的图片是我的故事板。

有一个主视图主视图会将视图更改为扫描视图,并在按下 Scan (右栏按钮项)

StoryBoard Segue标识符ScanView

我使用以下代码将数据从 Main 传递到 Scan

当按下扫描(右栏按钮项目)

self.performSegueWithIdentifier("ScanView", sender: self)

并将数据传递给下一个视图

//prepare jumping to next page
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if (segue.identifier=="ScanView")
        let desViewController = segue.destinationViewController as! ScanViewController
        desViewController.myCenteralManager = myCenteralManager
    

它会在let desViewController = segue.destinationViewController as! ScanViewController 崩溃并显示如下错误:

Could not cast value of type 'UINavigationController' (0x3960e0a8) to 'BLEConnect.ViewController' (0x5514c).

有人可以教我如何解决这个问题吗?提前致谢。

【问题讨论】:

错误信息很清楚;您试图强制将 UINaigationController 强制转换为 ScanViewController。您可以将主视图控制器嵌入导航控制器而不是扫描视图中,否则您需要从导航控制器的 ViewControllers 属性访问扫描视图控制器。我也不喜欢从扫描视图回到主视图的那种外观。您应该使用 unwind segue,或者如果您在导航控制器中嵌入主视图控制器,则默认情况下后退按钮将在那里 【参考方案1】:

错误信息非常清楚,您尝试将segue.destinationViewController 设为ScanViewController,而实际上它是一个导航控制器。您需要先获取导航控制器,然后使用其topViewController 属性来获取目标视图控制器。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
 
    if (segue.identifier=="ScanView") 
        if let navController: UINavigationController = segue.destinationViewController as? UINavigationController 
            if let desViewController: ScanViewController = navController.topViewController as? ScanViewController 
                desViewController.myCenteralManager = myCenteralManager
            
        
    

【讨论】:

【参考方案2】:

您的NavigationController(可能)在 Interface Builder 中的位置错误。现在,当你继续时,你会去UINavigationController,而不是你期望的ScanViewController。这就是强制转换失败的原因,因为您试图将 UINavigationController 强制为 ScanViewController

要解决此问题,您应该将 MainViewController 放在 UINavigationController 中,然后直接转到您的 ScanViewController

This guide 准确展示了如何使用 Interface Builder、UINavigationController 和 segues 来实现您想要做的事情。

【讨论】:

【参考方案3】:

您可以将您的 导航控制器 嵌入到 主 ViewController 中并像上面那样执行 segue。那应该可以解决问题。

显示错误消息是因为您输入了 Navigation Controller 而不是 Scan ViewController

【讨论】:

以上是关于如何在 Swift 中通过 Segue 将数据传递到下一个视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中的两个场景之间传递数据?

在 Swift 2 中通过“prepareForSegue”传递数据

如何在没有 segue 的情况下在 Swift 3 中将数据从 VC 传递到另一个?

使用 Swift 3 将数据从 Modal Viewcontroller 传递到 rootController(不要 Segue)

通过 Segue 传递数据(swift 2)

Swift - Segue 没有被传递正确的数据