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オブジェクトがあります。しかし、実行しようとすると、ダウンキャスティングに関するエラーが発生します。
エラー編集
タイプ 'XXX.DisplayViewController'(0x1082dcd80)の値を 'XXX.VehicleDetailsTableViewController'(0x1082dc9a0)にキャストできませんでした。 (lldb)
ストーリーボードでセグエに識別子を与える必要があります。(たとえばmySegue
)
Xcode 10を使用Swift 4.x(Xcode 9および8でも動作します、Swift 3.x)
override func prepare(for segue: UIStoryboardSegue, sender: Any?){}
現在のUIViewController
から呼び出されるすべてのセグエに対して呼び出されます。 identifier
は異なるセグエを区別することです
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
}
}
Xcode 7を使用している場合、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
のセルをクリックしてトリガーされているかどうかを確認します。そうでない場合、ストーリーボードで提供される識別子名uは、ここで指定したものとは異なる必要があります。
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
}
}
}
「識別子」を使用しないでください。理由はわかりませんが、「segue.identifier」は常にゼロです。私はこのような準備メソッドを使用しましたが、動作します!
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