用prepareForSegue Swift传递对象 [英] Passing object with prepareForSegue Swift

查看:263
本文介绍了用prepareForSegue Swift传递对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将对象传递给另一个场景 prepareForSegue()

I am trying to pass an object to another scene with 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对象来捕获这些对象。但是,当我试图运行时,它会破坏并获得有关向下转换的错误。

And I have currentVehicle object to catch these object. But, when I try to run, it brokes and get error about downcasting.

错误编辑


无法将'XXX.DisplayViewController'
(0x1082dcd80)类型的值转换为'XXX.VehicleDetailsTableViewController'
(0x1082dc9a0)。 (lldb)

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


推荐答案

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

You have to give the segue an identifier in the storyboard.(say mySegue)

使用XCode 7,swift 2.x

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){....}

调用从当前 UIViewController 调用的所有segue。所以标识符用于区分不同的segue

Is called for all segues being called form your current UIViewController. So the identifier is to differentiate the different segues

然后使用此代码:

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

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

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

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

Place a breakpoint after nextScene and see if it is being triggered by clicking any cell in the TableView. If it isn't then the identifier name u provided in the storyboard must be different then the one given here.

这篇关于用prepareForSegue Swift传递对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆