Передача объекта с помощью 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, чтобы поймать этот объект. Но, когда я пытаюсь запустить, он ломается и получает ошибку о downcasting.

редактировать ошибка

не удалось привести значение типа ' XXX.DisplayViewController' (0x1082dcd80) в ' XXX.VehicleDetailsTableViewController' (0x1082dc9a0). (символы отладки)

4 ответов


вы должны дать segue идентификатор в раскадровке.(скажи mySegue)

использование XCode 7, swift 2.x

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){....}

вызывается для всех сегментов, вызываемых из вашего текущего UIViewController. Так что identifier является дифференцировать различные сегменты

тогда используйте этот код:

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 9, swift 4.x (также работает с 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. Если это не так, то имя идентификатора u, указанное в раскадровке, должно отличаться от указанного здесь.


в swift 3.0 Xcode 8 beta 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
    }
  }
}

В Swift 3, Xcode 8

просто не использовать "идентификатор". Не знаю почему, но ... идентификатор " всегда равен нулю. Я просто использовал такой метод подготовки и работает!

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let secondController = segue.destination as? SecondController {
        secondController.anyItemInSecondController = self.anyItemInFirstController
    }

эта ошибка говорит вам, что это segue.destinationViewController не является VehicleDetailsTableViewController. У нас недостаточно подробностей, чтобы объяснить почему.

Проверьте свои сегменты и убедитесь, что все они указывают на правильное место, и всегда проверяйте идентификатор своего сегмента перед выполнением приведения.

if segue.identifier == "theNameOfYourSegue" // then do your cast