AppDelegate.swiftから画面遷移する方法

SwiftXcodeAdvent Calendar
Tomu Obata
📅2018/12/22

AppDelegateクラスから、任意のタイミングで画面遷移する処理の実装方法についてまとめました。

はじめに

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日目の記事になります。

環境

画面遷移方法

では、本題に入ります。

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

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

遷移させたいControllerのStoryboard IDを設定している様子
遷移させたいControllerのStoryboard IDを設定している様子

上の画像の赤く囲った部分を、以下のように変更します。任意の適した値に設定してください。

Storyboard IDを設定後の様子
Storyboard IDを設定後の様子

1つ目の方法

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

以下の処理を、AppDelegateクラスの画面遷移させたい部分に記述します。

class AppDelegate: UIResponder, UIApplicationDelegate{


    // 中略


    //画面遷移させたい部分に以下の処理を記述
    // windowを生成
    self.window = UIWindow(frame: UIScreen.main.bounds)
    // Storyboardを指定
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    // Viewcontrollerを指定
    let initialViewController = storyboard.instantiateViewController(withIdentifier:     "AfterVC")
    // rootViewControllerに入れる
    self.window?.rootViewController = initialViewController
    // 表示
    self.window?.makeKeyAndVisible()


    // 中略


}

let storyboard = UIStoryboard(name: "Main", bundle: nil)nameには、画面遷移させたいControllerがあるStoryboardの名称を入れます。

let vc = storyboard.instantiateViewController(withIdentifier: "AfterVC")withIdentifierには、先ほどStoryboardで設定した値を入れます。

2つ目の方法

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

また、画面遷移元とどちらの方法も呼び出し元となる画面は、どの画面でも現在表示している画面が現在定義したControllerでなくても問題ない。

そのため、どのControllerでメソッドを定義しても画面遷移の処理は、動作します。

こちらの方法では、Controller.swiftで定義した現在画面を取得するメソッドをAppDelegate.swiftで実行し、取得した値を使いpresentメソッドで画面遷移します。

class ViewController: UIViewController{


    // 中略


    // 現在表示されている最前面の画面を取得するメソッド
    func getTopMostViewController()->UIViewController{
        TC = UIApplication.shared.keyWindow?.rootViewController;
        while ((TC!.presentedViewController) != nil) {
            TC = TC!.presentedViewController;
        }
        return TC!;
    }

    // 画面遷移させるメソッド
    func ChangeVC() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let AfterVC = storyboard.instantiateViewController(withIdentifier: "AfterVC")

        TC?.present(AfterVC, animated: true, completion: nil)


    // 中略


}

以下の処理を、AppDelegateクラスの画面遷移させたい部分に記述します。

class AppDelegate: UIResponder, UIApplicationDelegate{

    // グローバル宣言
    var CurrentVC = UIApplication.shared.keyWindow?.rootViewController


    // 中略


    //画面遷移させたい部分に以下の処理を記述
    ViewController().getTopMostViewController()
    ViewController().ChangeVC()


    // 中略


}

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

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

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

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

AppDelegate.swiftでの記述が短い

まとめ

極力、AppDelegateクラスの肥大化は処理の複雑化を避けるために、避けたいところです。

おわりに

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

参考サイト

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

SHARE

スポンサーリンク