質問: "hogehoge" show(vc, sender: nil) ``` というコードを書いたのですが、2行目のところで Could not cast value of type 'UIViewController' (0x10d1e21f0) to 'EC2018og.SessionViewController' (0x108676cb0). というエラーが出てしまい、対処方法がわかりません。 storyboardの遷移でエラーが出ます。(segueを使用しない方法で実装) にあるように、CustomClassやModuleを設定したりもしてみたのですが、全く変わりませんでした。 エラー文で検索をかけてみたのですが、これ以上の方法が見つかりません。何が問題なのかがわからないので、どなたか教えていただけないでしょうか。 SessionSelectViewController ![画像の説明をここに入力](https://i.stack.imgur.com/InPay.png) SessionViewController ![画像の説明をここに入力](https://i.stack.imgur.com/ZJiDQ.png)
回答: 遷移先のViewControllerをインスタンス化する方法が間違っています。 `storyboard.instantiateInitialViewController()`がインスタンス化するのは、対象のStoryboardの中で **Is Initial View Controller** に指定されているもの、Interface Builder上では以下のように左端のない矢印で示されているものです。(1つのStoryboardに1個だけしか存在できない。) !Initial VC あなたがリンクされた記事では、`instantiateInitialViewController()`ではなく、`instantiateViewControllerWithIdentifier(_:)`と言うメソッドを使っています。つまりStoryboard上でそれぞれのView Controllerに名前(Storyboard ID)をつけて、その名前を指定してインスタンス化する必要があります。(そうしないとiOSはどのView Controllerをインスタンス化したいのかわからないでしょう?) !SessionVC !SessionSelectVC (Storyboard IDはプログラムコード側と辻褄が合っていればなんでも構いません。クラス名をそのまま使うことも多いです。) 上記のようにStoryboard IDを正しく設定した上で、先ほどの行、次のように書き換えてみてください。 ``` let vc = storyboard.instantiateViewController(withIdentifier: "Session") as! SessionViewController ``` (記事の頃からSwiftのバージョンが上がっているので、メソッド名の見た目が変わっています。) ただ、 ***Segueを使おうと思ったのですが、クラッシュしてしまい、エラー文も出てこないため、Segueを使わない方法を使っています*** と言う記述から見て、StoryboardやSegueの仕組みをよく理解されないまま、目先のクラッシュやエラーメッセージが出てこなくなればOKとして逃げているので、回避策の方もうまく動かない、と言う結果になっているように見受けられます。 上記の修正で無事にご質問の問題が解消された場合には、是非ともSegueを使ってクラッシュしないアプリを作れるようチャレンジして見てください。もちろん、ここスタック・オーバーフローもなんらかのお役に立てるはずです。