ios 使用 prepareForSegue Swift 传递对象
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/31164654/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Passing object with prepareForSegue Swift
提问by Mehmet
I am trying to pass an object to another scene with prepareForSegue()
我正在尝试使用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
}
}
And I have currentVehicle object to catch these object. But, when I try to run, it brokes and get error about downcasting.
我有 currentVehicle 对象来捕捉这些对象。但是,当我尝试运行时,它会崩溃并出现有关向下转换的错误。
Error EDIT
错误编辑
Could not cast value of type 'XXX.DisplayViewController' (0x1082dcd80) to 'XXX.VehicleDetailsTableViewController' (0x1082dc9a0). (lldb)
无法将“XXX.DisplayViewController”(0x1082dcd80)类型的值转换为“XXX.VehicleDetailsTableViewController”(0x1082dc9a0)。(lldb)
回答by Raja Vikram
You have to give the segue an identifier in the storyboard.(say mySegue
)
你必须在故事板中给 segue 一个标识符。(比如mySegue
)
Using Xcode 10 swift 4.x(Also works with Xcode 9 & 8 , swift 3.x)
使用 Xcode 10 swift 4.x(也适用于 Xcode 9 & 8,swift 3.x)
override func prepare(for segue: UIStoryboardSegue, sender: Any?){}
Is called for all segues being called from your current UIViewController
. So the identifier
is to differentiate the different segues
调用从您当前调用的所有 segue UIViewController
。所以identifier
就是区分不同的segue
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
}
}
If you are using Using Xcode 7, swift 2.x
如果您使用的是 Using Xcode 7, swift 2.x
Then use this code:
然后使用此代码:
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
}
}
}
Place a breakpoint after nextScene
and see if it is being triggered by clicking any cell in the TableView
. If it isn't then the identifier name u provided in the storyboard must be different then the one given here.
在之后放置一个断点,nextScene
并通过单击TableView
. 如果不是,则故事板中提供的标识符名称必须与此处给出的标识符名称不同。
回答by Andrea Miotto
In swift 3.0 Xcode 8 beta 6
在 Swift 3.0 Xcode 8 beta 6 中
AnyObject
has been renamed to Any?
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
}
}
}
回答by Yusuf Demirci
In Swift 3, Xcode 8
在 Swift 3、Xcode 8 中
Just don't use "identifier". I don't know why but "segue.identifier" is always nil. I just used prepare method like this and works!
只是不要使用“标识符”。我不知道为什么,但“segue.identifier”始终为零。我只是使用了这样的准备方法并且有效!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let secondController = segue.destination as? SecondController {
secondController.anyItemInSecondController = self.anyItemInFirstController
}
回答by Travis
What that error is telling you is that segue.destinationViewController isn't a VehicleDetailsTableViewController. We don't have enough details to tell you why.
该错误告诉您的是 segue.destinationViewController 不是 VehicleDetailsTableViewController。我们没有足够的细节来告诉您原因。
Check your segues and make sure they're all pointing to the correct place, and always check the identifier of your segue before you perform a cast.
检查您的转场并确保它们都指向正确的位置,并始终在执行演员之前检查您的转场的标识符。
if segue.identifier == "theNameOfYourSegue" // then do your cast