web-dev-qa-db-fra.com

Passer un objet avec prepareForSegue Swift

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)

19
Mehmet

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.

50
Raja Vikram

Dans Swift 3.0 Xcode 8 beta 6

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

Dans Swift 3, Xcode 8

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
    }
3
Yusuf Demirci

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
2
Travis