使用 prepareForSegue Swift 传递对象

Passing object with prepareForSegue 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
        }
    }

而且我有 currentVehicle 对象来捕获这些对象。但是,当我尝试 运行 时,它崩溃了并出现关于向下转换的错误。

错误编辑

Could not cast value of type 'XXX.DisplayViewController' (0x1082dcd80) to 'XXX.VehicleDetailsTableViewController' (0x1082dc9a0). (lldb)

你必须在情节提要中给 segue 一个标识符。(比如 mySegue

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

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

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

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
    }
}

如果您使用的是 Xcode7, 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中的任何单元格来查看它是否被触发。如果不是,那么您在情节提要中提供的标识符名称必须与此处给出的不同。

该错误告诉您 segue.destinationViewController 不是 VehicleDetailsTableViewController。我们没有足够的详细信息来告诉您原因。

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

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

在 swift 3.0 Xcode 8 测试版 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
    }
  }
}

在Swift3,Xcode8

只是不要使用 "identifier"。我不知道为什么 "segue.identifier" 总是零。我只是使用了这样的准备方法并且有效!

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let secondController = segue.destination as? SecondController {
        secondController.anyItemInSecondController = self.anyItemInFirstController
    }