准备segue:无法将'UIViewController'类型的值转换为指定类型'SecondViewController'

时间:2015-11-16 22:10:06

标签: ios swift xcode-storyboard

我知道我必须在这里遗漏一些明显的东西,但我似乎无法通过它的实际类型来引用目标View Controller。我已经从头开始创建了一个新项目,以便按照以下步骤进行测试:

  • 创建新的单视图应用程序项目
  • 添加新的视图控制器
  • 创建一个新类,继承UIViewController,并将其命名为SecondViewController
  • 将此新类设置为第二个视图控制器的自定义类(其标题现在是第二视图控制器)
  • 向第一个视图控制器添加了一个按钮,并从中按住了一个按钮到第二个视图控制器,并从动作搜索列表中选择了显示
  • 为SecondViewController添加了'id'属性
  • 将此代码添加到第一个View Controller:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        let vc: SecondViewController = segue.destinationViewController
        vc.id = "test"
    }
    

导致错误Cannot convert value of type 'UIViewController' to specified type 'SecondViewController'。我已经尝试了所有我能想到的东西,尝试了所有的segue类型等,但是我没有想法。我知道segue本身正在工作,好像我注释掉它确实调用了第二个View Controller的代码(我甚至在指定中添加了一个标签,以确定)。

我是Swift和Storyboard的新手,所以这里可能很简单,我很遗憾,但是非常感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

您应该可以像这样设置值。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if let vc: SecondViewController = segue.destinationViewController as? SecondViewController {
        vc.id = "test"
    }
}

如果添加其他segue,这将更安全。

另一种方法是强制使用

转换控制器
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    let vc: SecondViewController = segue.destinationViewController as! SecondViewController
    vc.id = "test"
}

这段代码应该编译但是如果使用错误的destinationViewController调用它会崩溃而不是if let选项,如果它不是,那就不会设置目标控制器的id值预期的课程。

答案 1 :(得分:0)

在Swift中,你可以使用guard语句打开segue.destinationViewController强制转换

guard let destVC : SecondViewController = segue.destinationViewController as? SecondViewController else {
    return
}
destVC.id = "test"

或者对特定类型的UIViewController使用条件检查,其中值不是nil

if let destVC : SecondViewController? = segue.destinationViewController as? SecondViewController where destVC != nil {
    destVC?.id = "test"
    return
}