web-dev-qa-db-ja.com

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オブジェクトがあります。しかし、実行しようとすると、ダウンキャスティングに関するエラーが発生します。

エラー編集

タイプ 'XXX.DisplayViewController'(0x1082dcd80)の値を 'XXX.VehicleDetailsTableViewController'(0x1082dc9a0)にキャストできませんでした。 (lldb)

19
Mehmet

ストーリーボードでセグエに識別子を与える必要があります。(たとえば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は、ここで指定したものとは異なる必要があります。

50
Raja Vikram

In Swift 3.0 Xcode 8 beta 6

AnyObjectAny?に名前が変更されました

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
    }
  }
}
8
Miotz

In 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
    }
3
Yusuf Demirci

このエラーは、segue.destinationViewControllerがVehicleDetailsTableViewControllerではないことを示しています。理由を説明するのに十分な詳細がありません。

セグエをチェックし、それらがすべて正しい場所を指していることを確認し、キャストを実行する前に常にセグエの識別子をチェックします。

if segue.identifier == "theNameOfYourSegue" // then do your cast
2
Travis