使用 prepareForSegue Swift 传递对象
Passing object with 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 对象来捕获这些对象。但是,当我尝试 运行 时,它崩溃了并出现关于向下转换的错误。
错误编辑
Could not cast value of type 'XXX.DisplayViewController'
(0x1082dcd80) to 'XXX.VehicleDetailsTableViewController'
(0x1082dc9a0). (lldb)
你必须在情节提要中给 segue 一个标识符。(比如 mySegue
)
使用 Xcode 10 swift 4.x(也适用于 Xcode 9 & 8 , swift 3.x )
override func prepare(for segue: UIStoryboardSegue, sender: Any?){}
从您当前的 UIViewController
调用所有 segues。所以 identifier
是为了区分不同的 segues
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
}
}
如果您使用的是 Xcode7, swift 2.x
然后使用此代码:
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
}
}
}
在nextScene
之后放置一个断点,然后通过单击TableView
中的任何单元格来查看它是否被触发。如果不是,那么您在情节提要中提供的标识符名称必须与此处给出的不同。
该错误告诉您 segue.destinationViewController 不是 VehicleDetailsTableViewController。我们没有足够的详细信息来告诉您原因。
检查您的 segue 并确保它们都指向正确的位置,并在执行转换之前始终检查您的 segue 的标识符。
if segue.identifier == "theNameOfYourSegue" // then do your cast
在 swift 3.0 Xcode 8 测试版 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
}
}
}
在Swift3,Xcode8
只是不要使用 "identifier"。我不知道为什么 "segue.identifier" 总是零。我只是使用了这样的准备方法并且有效!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let secondController = segue.destination as? SecondController {
secondController.anyItemInSecondController = self.anyItemInFirstController
}
我正在尝试使用 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 对象来捕获这些对象。但是,当我尝试 运行 时,它崩溃了并出现关于向下转换的错误。
错误编辑
Could not cast value of type 'XXX.DisplayViewController' (0x1082dcd80) to 'XXX.VehicleDetailsTableViewController' (0x1082dc9a0). (lldb)
你必须在情节提要中给 segue 一个标识符。(比如 mySegue
)
使用 Xcode 10 swift 4.x(也适用于 Xcode 9 & 8 , swift 3.x )
override func prepare(for segue: UIStoryboardSegue, sender: Any?){}
从您当前的 UIViewController
调用所有 segues。所以 identifier
是为了区分不同的 segues
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
}
}
如果您使用的是 Xcode7, swift 2.x
然后使用此代码:
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
}
}
}
在nextScene
之后放置一个断点,然后通过单击TableView
中的任何单元格来查看它是否被触发。如果不是,那么您在情节提要中提供的标识符名称必须与此处给出的不同。
该错误告诉您 segue.destinationViewController 不是 VehicleDetailsTableViewController。我们没有足够的详细信息来告诉您原因。
检查您的 segue 并确保它们都指向正确的位置,并在执行转换之前始终检查您的 segue 的标识符。
if segue.identifier == "theNameOfYourSegue" // then do your cast
在 swift 3.0 Xcode 8 测试版 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
}
}
}
在Swift3,Xcode8
只是不要使用 "identifier"。我不知道为什么 "segue.identifier" 总是零。我只是使用了这样的准备方法并且有效!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let secondController = segue.destination as? SecondController {
secondController.anyItemInSecondController = self.anyItemInFirstController
}