[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)で受けつけています。

たった3ヶ月でマスタできるiPhoneアプリ開発集中オンライン講座開講!
たった3ヶ月でマスタできるiPhoneアプリ開発集中オンライン講座開講!
本書「iPhoneアプリ開発集中講座」を執筆している現役エンジニア講師陣が直接に指導!
基礎、課題実習で実践力を鍛えて、オリジナルアプリ公開までチャレンジ!
充実した転職支援もあるので、エンジニアへ転職したい人にもおすすめです!
現役エンジニアに相談できる無料相談会を開催中!