

Xcodeで、同じStoryboard上で画面遷移を行いたいと考えています

やりたいこと  
SessionSelectViewControllerのTableCellをクリックし、その値をSessionViewControllerへ画面遷移する際に値を渡したいです。  
Segueを使おうと思ったのですが、クラッシュしてしまい、エラー文も出てこないため、Segueを使わない方法を使っています

[![Storyboardの画像](https://i.stack.imgur.com/KJKKv.png)](https://i.stack.imgur.com/KJKKv.png)

困っていること  
SessionSelectViewControllerにて、

[code]

    let storyboard: UIStoryboard = self.storyboard!
    
    let vc = storyboard.instantiateInitialViewController() as! SessionViewController//ここでエラーが出ている
    vc.receiveTitle = "hogehoge"
    show(vc, sender: nil)
    
[/code]

というコードを書いたのですが、２行目のところで  
Could not cast value of type 'UIViewController' (0x10d1e21f0) to
'EC2018og.SessionViewController' (0x108676cb0).

というエラーが出てしまい、対処方法がわかりません。

[storyboardの遷移でエラーが出ます。(segueを使用しない方法で実装)](https://ja.stackoverflow.com/questions/20860/storyboard%E3%81%AE%E9%81%B7%E7%A7%BB%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%BE%E3%81%99-segue%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%AA%E3%81%84%E6%96%B9%E6%B3%95%E3%81%A7%E5%AE%9F%E8%A3%85)

にあるように、CustomClassやModuleを設定したりもしてみたのですが、全く変わりませんでした。  
エラー文で検索をかけてみたのですが、これ以上の方法が見つかりません。何が問題なのかがわからないので、どなたか教えていただけないでしょうか。

SessionSelectViewController

[![画像の説明をここに入力](https://i.stack.imgur.com/InPay.png)](https://i.stack.imgur.com/InPay.png)

SessionViewController

[![画像の説明をここに入力](https://i.stack.imgur.com/ZJiDQ.png)](https://i.stack.imgur.com/ZJiDQ.png)


CC BY-SA 4.0
2018-08-12T14:41:49.620
47466
2018-08-12T16:35:36.923
2018-08-12T16:35:36.923
13972
28458
question
swift ios xcode swift4
Xcodeで、画面遷移をしたいがCould not cast value of type 'UIViewController'と表示されてしまう


遷移先のViewControllerをインスタンス化する方法が間違っています。

`storyboard.instantiateInitialViewController()`がインスタンス化するのは、対象のStoryboardの中で
**Is Initial View Controller** に指定されているもの、Interface
Builder上では以下のように左端のない矢印で示されているものです。(1つのStoryboardに1個だけしか存在できない。)

[![Initial
VC](https://i.stack.imgur.com/CgnVI.png)](https://i.stack.imgur.com/CgnVI.png)

あなたがリンクされた記事では、`instantiateInitialViewController()`ではなく、`instantiateViewControllerWithIdentifier(_:)`と言うメソッドを使っています。つまりStoryboard上でそれぞれのView
Controllerに名前(Storyboard ID)をつけて、その名前を指定してインスタンス化する必要があります。(そうしないとiOSはどのView
Controllerをインスタンス化したいのかわからないでしょう?)

[![SessionVC](https://i.stack.imgur.com/TP300.png)](https://i.stack.imgur.com/TP300.png)

[![SessionSelectVC](https://i.stack.imgur.com/4sd82.png)](https://i.stack.imgur.com/4sd82.png)

(Storyboard IDはプログラムコード側と辻褄が合っていればなんでも構いません。クラス名をそのまま使うことも多いです。)

上記のようにStoryboard IDを正しく設定した上で、先ほどの行、次のように書き換えてみてください。

[code]

    let vc = storyboard.instantiateViewController(withIdentifier: "Session") as! SessionViewController
    
[/code]

(記事の頃からSwiftのバージョンが上がっているので、メソッド名の見た目が変わっています。)

* * *

ただ、

**_Segueを使おうと思ったのですが、クラッシュしてしまい、エラー文も出てこないため、Segueを使わない方法を使っています_**

と言う記述から見て、StoryboardやSegueの仕組みをよく理解されないまま、目先のクラッシュやエラーメッセージが出てこなくなればOKとして逃げているので、回避策の方もうまく動かない、と言う結果になっているように見受けられます。

上記の修正で無事にご質問の問題が解消された場合には、是非ともSegueを使ってクラッシュしないアプリを作れるようチャレンジして見てください。もちろん、ここスタック・オーバーフローもなんらかのお役に立てるはずです。


CC BY-SA 4.0
2018-08-12T15:47:17.983
47471
2018-08-12T15:47:17.983
13972
47466
answer