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

Ошибка EDIT

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

Ответы

Ответ 1

Вы должны указать 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, указанное в раскадровке, должно быть иным, чем указанное здесь.

Ответ 2

В быстрой версии 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
    }
  }
}

Ответ 3

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

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

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

Ответ 4

В 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
    }