我正在尝试使用 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对象来捕获这些对象。但是,当我试图运行时,它会破坏并获得有关向下转换的错误。
错误编辑
无法转换类型' XXX.DisplayViewController'的值 (0x1082dcd80)到' XXX.VehicleDetailsTableViewController' (0x1082dc9a0)。 (LLDB)
答案 0 :(得分:49)
你必须在故事板中给segue一个标识符。(比如mySegue
)
使用Xcode 10 swift 4.x(也适用于Xcode 9& 8,swift 3.x)
override func prepare(for segue: UIStoryboardSegue, sender: Any?){}
调用从当前UIViewController
调用的所有segues。所以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
}
}
如果您使用的是使用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
}
}
}
在nextScene
之后放置一个断点,然后点击TableView
中的任意一个单元格来查看它是否被触发。如果不是,那么故事板中提供的标识符名称必须与此处给出的标识符不同。
答案 1 :(得分:8)
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
}
}
}
答案 2 :(得分:3)
只是不要使用“标识符”。我不知道为什么,但“segue.identifier”总是零。我刚刚使用了这样的准备方法并且有效!
Collectors.toList()
答案 3 :(得分:2)
错误告诉你的是segue.destinationViewController不是VehicleDetailsTableViewController。我们没有足够的细节告诉您原因。
检查您的segue并确保它们都指向正确的位置,并在执行演员表之前始终检查您的segue的标识符。
if segue.identifier == "theNameOfYourSegue" // then do your cast