UIViewController
ライフサイクルを管理するための正しい方法を教えてください。
特に、私はInitialize
クラスのモノタッチでViewDidLoad
、ViewWillAppear
、ViewDidAppear
、ViewWillDisappear
、ViewDidDisappear
、ViewDidUnload
、Dispose
とUIViewController
メソッドを使用する方法を知っていただきたいと思います。
これらのコマンドはすべて、View Controllerをロード/表示/非表示にしたときに、iOSによって適切なタイミングで自動的に呼び出されます。これらのメソッドはUIViewController
に結び付けられており、UIView
には結び付けられていないことに注意することが重要です。 UIView
を使用するだけでこれらの機能を得ることはできません。
Appleのサイト には素晴らしいドキュメントがあります 。ただ入れて:
ViewDidLoad
- クラスを作成してxibからロードするときに呼び出されます。初期設定や一度きりの作業に最適です。
ViewWillAppear
- ビューが表示される直前に呼び出されます。ビューが表示される前に毎回実行したいフィールドや操作を隠したり表示したりするのに便利です。ビュー間を行ったり来たりする可能性があるので、これはビューが画面に表示されるたびに呼び出されます。
ViewDidAppear
- ビューが表示された後に呼び出されます。アニメーションを開始したり、APIから外部データをロードしたりするのに最適な場所です。
ViewWillDisappear
/DidDisappear
- ViewWillAppear
/ViewDidAppear
と同じ考え方。
ViewDidUnload
/ViewDidDispose
- Objective-Cでは、ここで整理やリリースを行いますが、これは自動的に行われるので、ここで行う必要はあまりありません。
UIViewControllerのライフサイクルは次のとおりです。
http://rdkw.wordpress.com/2013/02/24/ios-uiviewcontroller-lifecycle/
これは最新のiOSバージョン用です(Xcode 9.3、Swift 4.1で変更)。以下はUIViewController
name__のライフサイクルを完成させるすべての段階です。
loadView()
loadViewIfNeeded()
viewDidLoad()
viewWillAppear(_ animated: Bool)
viewWillLayoutSubviews()
viewDidLayoutSubviews()
viewDidAppear(_ animated: Bool)
viewWillDisappear(_ animated: Bool)
viewDidDisappear(_ animated: Bool)
これらすべての段階について説明しましょう。
1。 loadView
name __
このイベントは、コントローラが管理するビューを作成します。 View Controllerがプログラムによって作成されたときにのみ呼び出されます。これは、コードでビューを作成するのに適した場所です。
これは、サブクラスがペン先を使用していない場合、サブクラスがカスタムビュー階層を作成する場所です。直接呼び出されるべきではありません。
2。 loadViewIfNeeded
name __
現在のviewController
name__のビューがまだ設定されていない場合、このメソッドはビューをロードしますが、これはiOS> = 9.0でのみ利用可能です。あなたがiOS <9.0をサポートしているのであれば、それが全体像に入るとは思わないでください。
まだ設定されていない場合は、View Controllerのビューをロードします。
3。 viewDidLoad
name __
viewDidLoad
name__イベントは、ビューが作成されてメモリにロードされたときにのみ呼び出されますが、そのビューの境界はまだ定義されていません。これは、View Controllerが使用しようとしているオブジェクトを初期化するのに適した場所です。
ビューがロードされた後に呼び出されます。コードで作成されたView Controllerの場合、これは-loadViewの後です。ペン先からアーカイブされていないView Controllerの場合、これはビューが設定された後です。
4。 viewWillAppear
name __
このイベントは、ビューが画面に表示されるたびにviewController
name__に通知します。この手順では、ビューに境界が定義されていますが向きは設定されていません。
ビューが表示されようとしているときに呼び出されます。デフォルトは何もしません。
5。 viewWillLayoutSubviews
name __
これが、ライフサイクルの最初のステップで、境界が確定します。拘束や自動レイアウトを使用していない場合は、ここでサブビューを更新したいと思うでしょう。これはiOS> = 5.0でのみ利用可能です。あなたがiOS <5.0をサポートしているなら、それでそれが絵に入ると期待しないでください。
View ControllerのビューのlayoutSubviewsメソッドが呼び出される直前に呼び出されます。サブクラスは必要に応じて実装できます。デフォルトはnopです。
6。 viewDidLayoutSubviews
name __
このイベントは、サブビューが設定されたことをView Controllerに通知します。サブビューを設定した後にサブビューを変更するのに適した場所です。これはiOS> = 5.0でのみ利用可能です。あなたがiOS <5.0をサポートしているなら、それでそれが絵に入ると期待しないでください。
View ControllerのビューのlayoutSubviewsメソッドが呼び出された直後に呼び出されます。サブクラスは必要に応じて実装できます。デフォルトはnopです。
7。 viewDidAppear
name __
viewDidAppear
name__イベントは、ビューが画面に表示された後に発生します。これは、バックエンドサービスまたはデータベースからデータを取得するのに適した場所です。
ビューが画面に完全に遷移したときに呼び出されます。デフォルトは何もしません
8。 viewWillDisappear
name __
viewWillDisappear
name__イベントは、提示されたviewController
name__のビューが他のviewController
name__の背後に表示されなくなる、却下される、隠される、または隠される直前に発生します。これは、ネットワークコールを制限したり、タイマーを無効にしたり、そのviewController
name__にバインドされているオブジェクトを解放したりするのに適した場所です。
ビューが閉じられたり、覆われたり、あるいは隠されたりしたときに呼び出されます。
9。 viewDidDisappear
name __
これは、表示されているviewController
name__の表示が消えたり、却下されたり、隠されたり、隠されたりした直後に発生するイベントで、誰でも対処できるライフサイクルの最後のステップです。
ビューが却下された、覆われた、または別の方法で隠された後に呼び出されます。デフォルトは何もしません
Appleのように、このメソッドを実装するときには、その特定のメソッドのsuper
name__実装を呼び出すことを忘れないでください。
UIViewControllerをサブクラス化する場合は、NIBを使用していなくても、このメソッドのスーパー実装を呼び出す必要があります。指定されたNIBでは、File's Ownerプロキシは、そのクラスをビューアウトレット付きのView Controllerサブクラスに設定する必要があります(便宜上、デフォルトのinitメソッドがこれを行い、両方のメソッド引数にnilを指定します)。メインビューに接続されています。このメソッドをnil nib名で呼び出すと、このクラスの
-loadView
メソッドは、自分のView Controllerのクラスと同じ名前のNIBをロードしようとします。そのようなNIBが実際には存在しない場合は、-setView:
が呼び出される前に-view
を呼び出すか、プログラムでビューを設定するために-loadView
メソッドをオーバーライドする必要があります。
これが役に立ったことを願っています。ありがとう。
UPDATE - @ThomasWがコメント内で指摘したように、メインビューのサブビューがロードされるとき以外にもviewWillLayoutSubviews
name__とviewDidLayoutSubviews
name__が呼び出されます。テーブルビューまたはコレクションビューのセルが読み込まれます。
iOS 10,11(Swift 3.1、Swift 4.0)
UIViewController
開発者のUIKit
によれば、
1。 loadView()
サブクラスが nib を使用していない場合、サブクラスがカスタムビュー階層を作成する場所です。直接呼び出されるべきではありません。
2。 loadViewIfNeeded()
まだ設定されていない場合は、View Controllerのビューをロードします。
3。 viewDidLoad()
ビューがロードされた後に呼び出されます。コードで作成されたView Controllerの場合、これは-loadViewの後です。ペン先からアーカイブされていないView Controllerの場合、これはビューが設定された後です。
4。 viewWillAppear(_ animated:Bool)
ビューが表示されようとしているときに呼び出されます。デフォルトは何もしません
5。 viewWillLayoutSubviews()
View ControllerのビューのlayoutSubviewsメソッドが呼び出される直前に呼び出されます。サブクラスは必要に応じて実装できます。デフォルトは何もしません。
6。 viewDidLayoutSubviews()
View ControllerのビューのlayoutSubviewsメソッドが呼び出された直後に呼び出されます。サブクラスは必要に応じて実装できます。デフォルトは何もしません。
7。 viewDidAppear(_ animated:Bool)
ビューが画面に完全に遷移したときに呼び出されます。デフォルトは何もしません
8。 viewWillDisappear(_ animated:Bool)
ビューが閉じられたり、覆われたり、あるいは隠されたりしたときに呼び出されます。デフォルトは何もしません
9。 viewDidDisappear(_ animated:Bool)
ビューが却下された、覆われた、または別の方法で隠された後に呼び出されます。デフォルトは何もしません
10。 viewWillTransition(サイズ調整:CGSize、コーディネータ:UIViewControllerTransitionCoordinator付き)
ビューがTransitioningのときに呼び出されます。
11。 willMove(toParentViewController親:UIViewController?)
12。 didMove(toParentViewController親:UIViewController?)
これら2つのメソッドは、子コントローラ間の移行時に呼び出すコンテナサブクラスにとって一般的なものです。それらがオーバーライドされるなら、オーバーライドはスーパーを呼ぶことを確実にするべきです。
子がその親から削除されているとき、これらのメソッドの両方におけるparent引数はnilです。それ以外の場合は、新しい親View Controllerと同じです。
13。 didReceiveMemoryWarning()
親アプリケーションがメモリ警告を受け取ったときに呼び出されます。 iOS 6.0では、デフォルトでビューがクリアされなくなります。
IOS 6以降。新しい図は次のとおりです。
メソッドviewWillLayoutSubviews
とviewDidLayoutSubviews
は図には記載されていませんが、これらはviewWillAppear
とviewDidAppear
の間で呼び出されます。それらは複数回呼び出すことができます。
UIViewControllerの ライフサイクルを担当するメソッドに集中しましょう。
作成:
- (void)init
- (void)initWithNibName:
ビュー作成:
- (BOOL)isViewLoaded
- (void)loadView
- (void)viewDidLoad
- (UIView *)initWithFrame:(CGRect)frame
- (UIView *)initWithCoder:(NSCoder *)coder
ビューステート変更の取り扱い:
- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
- (void)viewDidUnload
メモリ警告処理:
- (void)didReceiveMemoryWarning
割り当て解除
- (void)viewDidUnload
- (void)dealloc
詳細については、 UIViewControllerクラスリファレンス をご覧ください。
ここには、古くて不完全な情報がたくさんあります。 iOS 6以降の場合のみ:
loadView
[a]viewDidLoad
[a]viewWillAppear
viewWillLayoutSubviews
は、境界が最初に確定される時刻です。viewDidLayoutSubviews
viewDidAppear
*
viewWillLayoutSubviews
[b]*
viewDidLayoutSubviews
[b]脚注:
(a) - didReceiveMemoryWarning
中に手動でビューを削除した場合、loadView
とviewDidLoad
が再度呼び出されます。つまり、デフォルトでloadView
とviewDidLoad
は、View Controllerインスタンスごとに1回だけ呼び出されます。
(b)追加の回以上呼び出される場合があります。
Haiderの答えはiOS 6より前のバージョンでは正しいです。ただし、iOS 6以降はviewDidUnloadおよびviewWillUnloadが呼び出されることはありません。 docs 状態: "ビューはメモリ不足の条件下でパージされなくなり、このメソッドは呼び出されません。"
公式ドキュメントで状態遷移を説明する: https://developer.Apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html
この画像は、さまざまなビューの「will」と「did」のコールバックメソッド間の有効な状態遷移を示しています。
有効な状態遷移:
撮影元: https://developer.Apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewControllerクラスReference_2x.png
のとおり Appleのドキュメント - iOSアプリの開発を始める(Swift) - View Controllerの操作 - View Controllerのライフサイクルの理解
viewDidLoad()
:View Controllerのコンテンツビュー(ビュー階層の最上位)が作成され、ストーリーボードからロードされたときに呼び出されます。 …View Controllerに必要な追加設定を実行するには、この方法を使用します。
viewWillAppear()
:View Controllerのコンテンツビューがアプリケーションのビュー階層に追加される直前に呼び出されます。このメソッドを使用して、コンテンツビューが画面に表示される前に発生する必要がある操作をトリガします。
viewDidAppear()
:View Controllerのコンテンツビューがアプリケーションのビュー階層に追加された直後に呼び出されます。このメソッドを使用して、データの取得やアニメーションの表示など、ビューが画面に表示されたらすぐに発生する必要がある操作をトリガします。
viewWillDisappear()
:View Controllerのコンテンツビューがアプリケーションのビュー階層から削除される直前に呼び出されます。このメソッドを使用して、変更のコミットやファーストレスポンダのステータスの辞任などのクリーンアップタスクを実行します。
viewDidDisappear()
:View Controllerのコンテンツビューがアプリケーションのビュー階層から削除された直後に呼び出されます。このメソッドを使用して、追加の破棄アクティビティを実行します。