如何通过Swift中的Segue将数据传递给下一个View?

时间:2016-08-10 01:08:40

标签: ios swift uiviewcontroller uinavigationcontroller

我在Swift开发。

以下图片是我的故事板。

enter image description here

主视图主视图会将视图更改为扫描视图,并在按时将数据传递到 Scan view 扫描(右栏按钮项目)

StoryBoard Segue 标识符 ScanView

我使用以下代码将数据从传递到扫描

扫描(右栏按钮项目)

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).

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

3 个答案:

答案 0 :(得分: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
            }
        }
    }
}

答案 1 :(得分:0)

您的NavigationController(可能)在Interface Builder中的位置错误。现在,当你离开时,你将转向UINavigationController而不是ScanViewController,就像你期望的那样。这就是演员表失败的原因,因为你试图强迫UINavigationController成为ScanViewController

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

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

答案 2 :(得分:0)

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

显示错误消息是因为您输入的类型为导航控制器,而不是扫描ViewController