J'essaie de passer un objet à une autre scène avec 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
}
}
Et j'ai un objet currentVehicle pour attraper ces objets. Mais, quand j'essaye de courir, ça casse et j'obtiens une erreur sur le downcasting.
Erreur EDIT
Impossible de convertir la valeur de type "XXX.DisplayViewController" (0x1082dcd80) en "XXX.VehicleDetailsTableViewController" (0x1082dc9a0). (lldb)
Vous devez donner un identifiant à la séquence dans le storyboard (par exemple mySegue
)
tilisation de Xcode 10 Swift 4.x (Fonctionne également avec Xcode 9 & 8, Swift 3.x)
override func prepare(for segue: UIStoryboardSegue, sender: Any?){}
Est appelé pour toutes les séquences appelées depuis votre UIViewController
actuel. Donc, le identifier
est de différencier les différentes séquences
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
}
}
Si vous utilisez Xcode 7, Swift 2.x
Utilisez ensuite ce code:
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
}
}
}
Placez un point d'arrêt après nextScene
et voyez s'il est déclenché en cliquant sur n'importe quelle cellule dans TableView
. Si ce n'est pas le cas, le nom d'identifiant u fourni dans le storyboard doit être différent de celui donné ici.
AnyObject
a été renommé 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
}
}
}
N'utilisez simplement pas "identifiant". Je ne sais pas pourquoi mais "segue.identifier" est toujours nul. Je viens d'utiliser la méthode de préparation comme celle-ci et ça marche!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let secondController = segue.destination as? SecondController {
secondController.anyItemInSecondController = self.anyItemInFirstController
}
Ce que cette erreur vous dit, c'est que segue.destinationViewController n'est pas un VehicleDetailsTableViewController. Nous n'avons pas suffisamment de détails pour vous expliquer pourquoi.
Vérifiez vos séquences et assurez-vous qu'elles pointent toutes au bon endroit, et vérifiez toujours l'identifiant de votre séquence avant d'effectuer un casting.
if segue.identifier == "theNameOfYourSegue" // then do your cast