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

Nia*_*all 3 ios xcode-storyboard swift

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

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

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

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

我是Swift和Storyboard的新手所以这可能是我在这里缺少的一些简单的东西,但任何帮助都将不胜感激!

Mor*_*iya 5

您应该能够像这样设置值.

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

如果添加其他segue,这也会更安全.

另一种方法是强制执行控制器

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    let vc: SecondViewController = segue.destinationViewController as! SecondViewController
    vc.id = "test"
}
Run Code Online (Sandbox Code Playgroud)

这个代码应该编译但是如果使用错误的destinationViewController调用它会崩溃,而不是if let如果它不是目标类就不设置目标控制器的id值的选项.