用prepareForSegue Swift传递对象

Meh*_*met 19 xcode storyboard ios uistoryboard swift

我试图用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
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

错误编辑

无法将"XXX.DisplayViewController"类型的值(0x1082dcd80)转换为"XXX.VehicleDetailsTableViewController"(0x1082dc9a0).(LLDB)

Raj*_*ram 50

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

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

override func prepare(for segue: UIStoryboardSegue, sender: Any?){}
Run Code Online (Sandbox Code Playgroud)

被称为从你当前调用的所有segues UIViewController.所以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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是使用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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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


And*_*tto 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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,segue.destinationViewController已经被重命名为segue.destination (2认同)