用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对象来捕捉这些对象。 但是,当我尝试运行时,它会导致向下转换错误。
错误编辑
无法将types“XXX.DisplayViewController”(0x1082dcd80)的值转换为“XXX.VehicleDetailsTableViewController”(0x1082dc9a0)。 (LLDB)
你必须给故事板上的一个标识符(比如mySegue
)
使用XCode 7,swift 2.x
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){....}
被称为从当前UIViewController
调用的所有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 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
任何单元时被触发。 如果不是,那么故事板中提供的标识符名称必须与此处给出的名称不同。
在迅速3.0 Xcode 8testing版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 } } }
那个错误告诉你的是,segue.destinationViewController不是一个VehicleDetailsTableViewController。 我们没有足够的细节来告诉你为什么。
检查你的赛段,并确保他们都指向正确的位置,并且在执行演员前总是检查你的赛格的标识符。
if segue.identifier == "theNameOfYourSegue" // then do your cast
在Swift 3中,Xcode 8
只是不要使用“标识符”。 我不知道为什么,但“segue.identifier”总是零。 我只是用这样的准备方法和工作!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let secondController = segue.destination as? SecondController { secondController.anyItemInSecondController = self.anyItemInFirstController }