[Swift,iOS]UITabBarController Lifecycle(ライフサイクル)の解説|viewDidLoad,viewWillAppearなど

[Swift,iOS]UITabBarController Lifecycle(ライフサイクル)の解説|viewDidLoad,viewWillAppearなど

こんにちは、こばやしよしのり @yoshiii514 です。
UITabBarControllerのライフサイクルは、UIViewControllerのライフサイクルとは違います。その点を注意して、UITabBarControllerのライフサイクルを理解します。

前提知識

Xcode、Swiftの基礎学習をしていることが前提になります。初学者の方は、次の記事を参考に基礎学習を済ませてください。
 初心者向け iPhone(iOS)アプリ開発おすすめ本と勉強方法!

基本となるUIViewControllerのライフサイクルの理解が必要です。次の記事を参考に学習を済ませてください。
 [Swift,iOS]UIViewController Lifecycle(ライフサイクル)の解説

UITabBarControllerのライフサイクルの検証

次のように簡単なUITabBarControllerで画面Aと画面Bを作ります。
各画面では実行されたメソッド名のログが出力されるようにしています。

[Swift,iOS]UITabBarController Lifecycle(ライフサイクル)の解説|viewDidLoad,viewWillAppearなど

検証1.画面Aの起動時

最初に起動されたときです。追加部分が赤字です。

画面A:viewDidLoad()
画面A:viewWillAppear(_:)
画面A:viewDidAppear(_:)

UITabBarControllerでは、最初に表示される画面Aのみ読み込まれていることがわかります。画面Bはなにも動いていません。

検証2.画面Aから画面Bに遷移したとき

検証1からのすべてのログをだしてます。追加部分が赤字です。

画面A:viewDidLoad()
画面A:viewWillAppear(_:)
画面A:viewDidAppear(_:)
—画面B:viewDidLoad()
—画面B:viewWillAppear(_:)
画面A:viewWillDisappear(_:)
画面A:viewDidDisappear(_:)
—画面B:viewDidAppear(_:)

画面Aと画面Bのメソッドが混ざってうごきます。簡単にメソッドの流れを説明すると次のとおり。

①画面Aを表示した状態で、画面Bの表示を始める
②画面Bを表示する途中で、画面Aを非表示にする
②画面Aが非表示になったあとで、画面Bが表示される

検証3.画面Bから画面Aに戻るとき

検証1からのすべてのログをだしてます。追加部分が赤字です。

画面A:viewDidLoad()
画面A:viewWillAppear(_:)
画面A:viewDidAppear(_:)
—画面B:viewDidLoad()
—画面B:viewWillAppear(_:)
画面A:viewWillDisappear(_:)
画面A:viewDidDisappear(_:)
—画面B:viewDidAppear(_:)
画面A:viewWillAppear(_:)
—画面B:viewWillDisappear(_:)
—画面B:viewDidDisappear(_:)
画面A:viewDidAppear(_:)

メソッドの流れを解説すると次のとおり。

①画面AでviewDidLoadは発生せず、viewWillAppearから始まる
②画面Aの表示を始めたときに、画面Bを非表示にする
③画面Bが完全に非表示になったあとで、画面Aを表示する

①の動きから、検証2で画面Aから画面Bに遷移したときに、画面Aは非表示になるけど、完全に終了していないことがわかる。

検証4.再び、画面Aから画面Bに遷移したとき

検証1からのすべてのログをだしてます。追加部分が赤字です。

画面A:viewDidLoad()
画面A:viewWillAppear(_:)
画面A:viewDidAppear(_:)
—画面B:viewDidLoad()
—画面B:viewWillAppear(_:)
画面A:viewWillDisappear(_:)
画面A:viewDidDisappear(_:)
—画面B:viewDidAppear(_:)
画面A:viewWillAppear(_:)
—画面B:viewWillDisappear(_:)
—画面B:viewDidDisappear(_:)
画面A:viewDidAppear(_:)
—画面B:viewWillAppear(_:)
画面A:viewWillDisappear(_:)
画面A:viewDidDisappear(_:)
—画面B:viewDidAppear(_:)

検証3の逆の動きになります。
メソッドの流れを解説すると次のとおり。

①画面BでviewDidLoadは発生せず、viewWillAppearから始まる
②画面Bの表示を始めたときに、画面Aを非表示にする
③画面Aが完全に非表示になったあとで、画面Bを表示する

サンプルコードの保管場所

検証で使ったXcodeプロジェクトは次の場所にあります。

 https://github.com/YoshinoriKobayashi/SwiftToolTrick/tree/main/lifecycle

あとがき

UITabBarControllerはUIViewControllerとライフサイクルの動きが異なりますので、注意してください。
質問は、僕のTwitter(@yoshiii514)で受けつけています。

動画で学ぶiOSアプリ開発講座を公開!
「体験しながら学ぶ」最短での脱初心者カリキュラムiPhoneアプリ開発集中講座[オンライン版]Mac・Xcode12・iOS14・Swift5.3・SwiftUI完全対応
「体験しながら学ぶ」ことで、最短での脱初心者を目指すアプリ開発講座です。

【本講座に含まれているもの】
・全額返金保証
・Swift文法解説
・SwiftUI完全対応
・サンプルアプリ6本作成
・チャットサポート(Slack)

執筆陣が徹底解説、サポートをします💪
 【先行ユーザー特典!先着10名様40,000円OFF】 iPhoneアプリ開発集中講座[オンライン版]