質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

5964閲覧

Swiftで画面遷移できない

takhub

総合スコア28

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/09/19 08:09

編集2016/09/20 02:18

お世話になります。

###やりたいこと
下記URLを参考にsegueを使わずに画面遷移を行おうとしています。
http://easyramble.com/swift-navigationcontroller-pushviewcontroller.html

###エラー内容
エラーは下記の通りです。

fatal error: unexpectedly found nil while unwrapping an Optional value

###該当コード
該当のコードは下記です。

swift

1public override func viewDidAppear(animated: Bool) { 2 let next = self.storyboard?.instantiateViewControllerWithIdentifier("modal") as! BarChartViewController 3 self.navigationController?.pushViewController(next, animated: true) 4}

###Storyboard
storyboardは下記の通りで、ユーザーの入力なしに開発者側の任意のタイミングで右のviewへ移動させたいです。

イメージ説明

###補足情報
いまはとりあえずviewDidAppear()内に書いていて、
アプリを立ち上げてすぐに次の画面へ遷移させようとしています。
よろしくお願いします。

なお、print(next)の出力結果は下記です。

<FoodAPISample.BarChartViewController: 0x1476531c0>

BarChartViewControllerは遷移先なのですが、Custom ClassのModuleにプロジェクト名である'FoodAPISample'を入力してみたり、IdentityのRestoration IDにStoryboard ID同様'modal'を入力してみたりしましたが、エラーは変わりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/19 08:44

Storyboardを見る限り、`self.navigationController`がありません。`print(self.navigationController)`と書いて結果を確かめてみてください。ナビゲーションコントローラを使って画面を遷移するには、ナビゲーションコントローラを使った画面の構成になっていなければなりません。具体的には、Scan View Controllerをナビゲーションコントローラで包みます。
takhub

2016/09/19 08:46 編集

k_katsumiさん、早速のコメントありがとうございます。TakeOneさんのご指摘を受けて修正していますが、今も誤っていますか? なお`print(self.navigationController)`の結果は、`Optional(<UINavigationController: 0x15d03c800>)`となります。
退会済みユーザー

退会済みユーザー

2016/09/19 08:49

いえ、その部分は合ってると思います。コメントを書いてる間にTakeOneさんの回答が記入されたので内容が重複しました。 とりあえずどこで`unexpectedly found nil`が起こってるのかを突き止める(何がnilか)必要があります。`print(next)`などとして、何がnilが調べられませんか?
guest

回答1

0

ベストアンサー

viewDidLoadのタイミングでは画面遷移できません。
今の画面がちゃんと表示されてからでないと次の画面に遷移できません。
なので、なるべくすぐに画面遷移したいならviewDidAppearのタイミングで画面遷移してください。

それと、今質問に貼られているStoryboardの画面を見ると、UINavigationControllerを使わず直接Scan View Controllerを初期画面にして開始しているので、self.navigationControllerはnilです。
このため、pushViewController自体実行されず、何もエラーが出なかったのだと思います。

UINavigationControllerの使い方の基礎を勉強してください。

投稿2016/09/19 08:26

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takhub

2016/09/19 08:43

TakeOneさん、早速のご回答ありがとうございます。基礎知識がなくお恥ずかしい限りです。 ご指摘いただいたとおり、UINavigationControllerを初期画面にし直した状態(質問に反映済みです)でやってみましたが、fatal errorが出てしまいます。
TakeOne

2016/09/19 08:59

とりあえずviewDidAppearのコードのまずい点を指摘しておくと、viewDidAppearはpublicじゃありません。それと先頭で`super.viewDidAppear(animated)`を実行する必要があります。 しかし、「fatal error: unexpectedly found nil while unwrapping an Optional value」のエラーは、それが原因ではないと思います。 質問に描かれている範囲では上記の指摘以外は正しそうに見えるので、私の方でコピペして実行してみたら、正常に画面遷移できました。 どこの行でそのエラーが発生しているのかと、そのエラーが発生して止まっている時に、どの変数がnilなのかを調べれば原因がわかると思います。
TakeOne

2016/09/19 09:03

追伸です。追記した方のコードは本来やりたいことと違うことなのだと思うので、どこに書いたのかわかりませんが、もし自分のコードに残っているのであれば、混乱するので削除した方が良いと思います。
TakeOne

2016/09/19 09:07 編集

もしかして、画面遷移した先(BarChartViewController)でエラーが発生しているんじゃないですか?
takhub

2016/09/19 09:13 編集

viewDidAppearについてご丁寧にご教示くださりありがとうございます。 そうですね、k_katsumiさんにご指摘いただいて遷移先に異常があることに気づく事ができました。nilの原因を探してみてstoryboardを編集した結果、無事に画面遷移ができました。 結局のところ画面遷移自体は問題なく、遷移先(のview controllerを入れ替えた際に)viewとコードの依存関係が切れてしまっていたために、nilとなっていたようです。 TakeOneさん、k_katsumiさん、おかげさまでデバッグの基礎知識が身につきました。お二方ともご協力くださり大変ありがとうございました。 k_katsumiさん、大きなヒントをいただきながらBAにさせていただけず申し訳ございません。
takhub

2016/09/19 09:14

追記についてはTakeOneさんのおっしゃる通り混乱を招くので、削除させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問