用prepareForSegue Swift传递对象

时间:2015-07-01 14:46:46

标签: ios xcode swift storyboard uistoryboard

我正在尝试使用 prepareForSegue()

将对象传递到另一个场景
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        var nextScene =  segue.destinationViewController as! VehicleDetailsTableViewController

        // Pass the selected object to the new view controller.
        if let indexPath = self.tableView.indexPathForSelectedRow() {
            let selectedVehicle = vehicles[indexPath.row]
            nextScene.currentVehicle = selectedVehicle
        }
    }

我有currentVehicle对象来捕获这些对象。但是,当我试图运行时,它会破坏并获得有关向下转换的错误。

错误编辑

  

无法转换类型' XXX.DisplayViewController'的值   (0x1082dcd80)到' XXX.VehicleDetailsTableViewController'   (0x1082dc9a0)。 (LLDB)

4 个答案:

答案 0 :(得分:49)

你必须在故事板中给segue一个标识符。(比如mySegue

使用Xcode 10 swift 4.x(也适用于Xcode 9& 8,swift 3.x)

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

调用从当前UIViewController调用的所有segues。所以identifier是区分不同的segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "mySegue" , 
       let nextScene = segue.destination as? VehicleDetailsTableViewController , 
       let indexPath = self.tableView.indexPathForSelectedRow {
        let selectedVehicle = vehicles[indexPath.row]
        nextScene.currentVehicle = selectedVehicle
    }
}

如果您使用的是使用Xcode 7,swift 2.x

然后使用此代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "mySegue" {
    var nextScene =  segue.destinationViewController as! VehicleDetailsTableViewController

    // Pass the selected object to the new view controller.
    if let indexPath = self.tableView.indexPathForSelectedRow {
        let selectedVehicle = vehicles[indexPath.row]
        nextScene.currentVehicle = selectedVehicle
    }
  }
}

nextScene之后放置一个断点,然后点击TableView中的任意一个单元格来查看它是否被触发。如果不是,那么故事板中提供的标识符名称必须与此处给出的标识符不同。

答案 1 :(得分:8)

在swift 3.0 Xcode 8 beta 6

AnyObject已重命名为Any?

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    let nextScene =  segue.destinationViewController as! VehicleDetailsTableViewController

    // Pass the selected object to the new view controller.
    if let indexPath = self.tableView.indexPathForSelectedRow {
        let selectedVehicle = vehicles[indexPath.row]
        nextScene.currentVehicle = selectedVehicle
    }
  }
}

答案 2 :(得分:3)

在Swift 3中,Xcode 8

只是不要使用“标识符”。我不知道为什么,但“segue.identifier”总是零。我刚刚使用了这样的准备方法并且有效!

Collectors.toList()

答案 3 :(得分:2)

错误告诉你的是segue.destinationViewController不是VehicleDetailsTableViewController。我们没有足够的细节告诉您原因。

检查您的segue并确保它们都指向正确的位置,并在执行演员表之前始终检查您的segue的标识符。

if segue.identifier == "theNameOfYourSegue" // then do your cast