Передача объекта с помощью 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