首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用prepareForSegue Swift传递对象

使用prepareForSegue Swift传递对象
EN

Stack Overflow用户
提问于 2015-07-01 22:46:46
回答 4查看 36.8K关注 0票数 19

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

代码语言:javascript
复制
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)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-01 22:54:58

您必须在故事板中为segue指定一个标识符(比如mySegue)。

使用Xcode10 swift 4.x的(也适用于Xcode9&8,swift 3.x)

代码语言:javascript
复制
override func prepare(for segue: UIStoryboardSegue, sender: Any?){}

从当前UIViewController调用的所有segues都会调用。因此,identifier是为了区分不同的序列

代码语言:javascript
复制
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,则使用

然后使用以下代码:

代码语言:javascript
复制
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中的任何单元格触发该断点。如果不是,那么在故事板中提供的标识符名称u一定不同于这里给出的名称。

票数 50
EN

Stack Overflow用户

发布于 2016-08-24 07:27:41

在swift 3.0 Xcode 8 beta 6中

AnyObject已重命名为Any?

代码语言:javascript
复制
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
    }
  }
}
票数 8
EN

Stack Overflow用户

发布于 2017-05-18 16:27:58

在Swift 3中,Xcode 8

只要不使用“标识符”即可。我不知道为什么,但"segue.identifier“总是为零。我就像这样使用了prepare方法,并且工作了!

代码语言:javascript
复制
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let secondController = segue.destination as? SecondController {
        secondController.anyItemInSecondController = self.anyItemInFirstController
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31164654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档