AppDelegate.swiftから画面遷移する方法【2つの実装パターンを解説】

AppDelegate.swiftから特定のタイミングで画面遷移させる方法を解説。ローカル通知受信時などに使える2つの実装パターンを比較し、それぞれのメリット・デメリットを紹介します。

はじめに

AppDelegateクラスでローカル通知を受け取った際に、画面遷移させたいといった場合などを想定しています。
Controller間の画面遷移は、以下の記事等をご参考にしてください。(いずれもSwift4系です)
NavigationControllerとViewControllerの遷移/値の渡し方/受け取り方/戻り方まとめ - あなたにフィット
SwiftでiOSアプリを開発していると、画面遷移と値の受け渡しに無茶苦茶苦戦します。Androidだとあんなに簡単なのに。。。と度々絶望する日々。 と言うことで、色んなパターンの画面遷移方法をまとめておきました。ソースもgithub上にありますのでご活用ください。 Swift: 4.0.3 Xcode: 9.2 iOS: 11.2 ソース: https://github.com/yheihei/ios/tree/master/MoveViewTutorial 下記4つを説明する。 こちらの記事は当初運営者メンバーの執筆でしたが現在は離れており、寄稿記事となっています。そのため当記事の情報アップデートにつきましては2020年1月をもって終了・サポート・内容についての問合せなどは受けておりません。また、記事内容を利用された際に生じた内容にも責任を負えませんのでご了承ください。 UINavigationControllerへの遷移(StoryBoardから)と値の受け渡し方/戻し方 UINavigationControllerへの遷移(コードから)と値の受け渡し方/戻し方 UIViewControllerへの遷移(StoryBoardから)と値の受け渡し方/戻し方 UIViewControllerへの遷移(コードから)と値の受け渡し方/戻し方 作りたい遷移はこの部分。 本章では、 StoryBoardを使って 、UINavigationControllerがついたViewControllerに値を渡して画面遷移し、値を元の画面に戻すまでをやる。下記の様な感じ。 まず値を渡して。 値を前画面に戻す。 それでは実装する。 NavitukiViewController.swift class NavitukiViewController: UIViewController { var receiveText:String? // 前画面からのテキストがここに入る TopViewController.swift override func prepare(for segue: UIStoryboardSegue, sender: Any?)
また、この記事は KIT Developer Advent Calendar 2018 21日目の記事になります。

環境

  • macOS Mojavaのバーション:10.14
  • Xcodeのバーション:10.1
  • Swiftのバーション:4.2.1

画面遷移方法

では、本題に入ります。
これから、2つの方法について紹介していきます。どちらの方法も、画面遷移させたいControllerを指定するためを設定する必要がありますが、それ以外は、コードで完結します。

まず、遷移させたいControllerのStoryboard IDを設定します

遷移させたいControllerのStoryboard IDを設定している様子 | 遷移させたいControllerのStoryboard IDを設定している様子
遷移させたいControllerのStoryboard IDを設定している様子 | 遷移させたいControllerのStoryboard IDを設定している様子
上の画像の赤く囲った部分を、以下のように変更します。任意の適した値に設定してください。
Storyboard IDを設定後の様子 | Storyboard IDを設定後の様子
Storyboard IDを設定後の様子 | Storyboard IDを設定後の様子

1つ目の方法

AppDelegateでWindowを生成して、生成したWindowにControllerを設定し遷移させる

以下の処理を、AppDelegateクラスの画面遷移させたい部分に記述します。
  • AppDelegate.swift
には、画面遷移させたいControllerがあるStoryboardの名称を入れます。
には、先ほどStoryboardで設定した値を入れます。

2つ目の方法

遷移元となるControllerで画面遷移するメソッドを定義し、で呼び出す

また、画面遷移元とどちらの方法も呼び出し元となる画面は、どの画面でも現在表示している画面が現在定義したControllerでなくても問題ない。
そのため、どのControllerでメソッドを定義しても画面遷移の処理は、動作します。
こちらの方法では、で定義した現在画面を取得するメソッドをで実行し、取得した値を使いメソッドで画面遷移します。
  • Controller.swift
以下の処理を、AppDelegateクラスの画面遷移させたい部分に記述します。
  • AppDelegate.swift

2つの遷移方法の違いについて

1つ目の画面遷移方法のメリット

  • 画面遷移する処理のコードが、AppDelegateクラスのみで完結する

1つ目の画面遷移方法のデメリット

  • 画面遷移させるたびに、AppDelegateクラスにWindowを生成する処理を記述することになるため、何度も画面遷移する場合は、コードが肥大化する

2つ目の画面遷移方法のメリット

AppDelegate.swiftでの記述が短い

  • AppDelegateでは、Controllerで定義したメソッドの呼び出しタイミングのみ明記することになる。
  • メソッドを切り出しているため、柔軟に処理を変更可能
  • AppDelegateクラスの肥大化を避けることができる。

まとめ

  • 何度もAppDelegateクラスから画面遷移しない場合は、コードがAppDelegateクラスのみで完結する1つ目の方法でも問題ない
  • 基本は、AppDelegateクラスの肥大化を避けることができ、1つ目の方法より柔軟な変更に強い、2つ目の方法を使うべき
極力、AppDelegateクラスの肥大化は処理の複雑化を避けるために、避けたいところです。

おわりに

AppDelegateクラスからの画面遷移処理にも様々な記述方法があり、それぞれ学びがありました!

参考サイト

💡
この記事はこちらのクロスポストになります

小幡 十矛(Obata Tomu)|価値を共創するエンジニア
東京を拠点に、アプリ開発・新規事業立ち上げ・ブランドづくりに取り組んでいます。
2021年にサイバーエージェントへ新卒入社後、ABEMA Live や AmebaブログのiOSアプリ開発を担当
現在はフリーランスとして、複数の新規プロダクトやリアル店舗の立ち上げに挑戦中です。
🎯 Mission|人の挑戦を加速する仕組みをつくる ── アイデアを形にし、前に進める“土台”や“場”を共創する
📌 「リアルな場 × デジタル」の可能性を探求し、新しい挑戦が生まれる土壌を育てる
🔹 エンジニアリング × ビジネスの視点から、アイデアを形にし、成長を支えていく
🔹 実店舗オーナーを目指し、オーダースーツ・ドライヘッドスパ・セレクトショップの複合店舗の立ち上げにも挑戦中
👥 特に、社会人1〜5年目くらいで
「やりたい気持ちはあるけど、最初の一歩に迷っている」方へ。 「自分の可能性をもっと広げたい」 「モヤっとしたアイデアがあるけど、どう進めていいかわからない」 そんなフェーズにいる方と、一緒に考えたり、手を動かしたりできたら嬉しいです。
🌱 「挑戦したい20代」との出会いも、大切にしています。 「ちょっと話してみたいな」くらいの気持ちで、気軽に声をかけてもらえたら嬉しいです!🙌
📷 Instagram(リアルイベントや趣味の発信中心): https://www.instagram.com/tomu28creator
🌐 詳しいプロフィールはこちら https://obata-tomu.jp/