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