web-dev-qa-db-ja.com

iOS UIViewControllerのライフサイクルを理解しようとしている

UIViewControllerライフサイクルを管理するための正しい方法を教えてください。

特に、私はInitializeクラスのモノタッチでViewDidLoadViewWillAppearViewDidAppearViewWillDisappearViewDidDisappearViewDidUnloadDisposeUIViewControllerメソッドを使用する方法を知っていただきたいと思います。

268
Lorenzo B

これらのコマンドはすべて、View Controllerをロード/表示/非表示にしたときに、iOSによって適切なタイミングで自動的に呼び出されます。これらのメソッドはUIViewControllerに結び付けられており、UIViewには結び付けられていないことに注意することが重要です。 UIViewを使用するだけでこれらの機能を得ることはできません。

Appleのサイト には素晴らしいドキュメントがあります 。ただ入れて:

  • ViewDidLoad - クラスを作成してxibからロードするときに呼び出されます。初期設定や一度きりの作業に最適です。

  • ViewWillAppear - ビューが表示される直前に呼び出されます。ビューが表示される前に毎回実行したいフィールドや操作を隠したり表示したりするのに便利です。ビュー間を行ったり来たりする可能性があるので、これはビューが画面に表示されるたびに呼び出されます。

  • ViewDidAppear - ビューが表示された後に呼び出されます。アニメーションを開始したり、APIから外部データをロードしたりするのに最適な場所です。

  • ViewWillDisappear/DidDisappear - ViewWillAppear/ViewDidAppearと同じ考え方。

  • ViewDidUnload/ViewDidDispose - Objective-Cでは、ここで整理やリリースを行いますが、これは自動的に行われるので、ここで行う必要はあまりありません。

384
Jacob Knobel

UIViewControllerのライフサイクルは次のとおりです。

http://rdkw.wordpress.com/2013/02/24/ios-uiviewcontroller-lifecycle/

A view controller's lifecycle, diagrammed

395
Haider

これは最新のiOSバージョン用です(Xcode 9.3、Swift 4.1で変更)。以下はUIViewControllername__のライフサイクルを完成させるすべての段階です。

  • loadView()

  • loadViewIfNeeded()

  • viewDidLoad()

  • viewWillAppear(_ animated: Bool)

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

  • viewDidAppear(_ animated: Bool)

  • viewWillDisappear(_ animated: Bool)

  • viewDidDisappear(_ animated: Bool)

これらすべての段階について説明しましょう。

1。 loadViewname __

このイベントは、コントローラが管理するビューを作成します。 View Controllerがプログラムによって作成されたときにのみ呼び出されます。これは、コードでビューを作成するのに適した場所です。

これは、サブクラスがペン先を使用していない場合、サブクラスがカスタムビュー階層を作成する場所です。直接呼び出されるべきではありません。

2。 loadViewIfNeededname __

現在のviewControllername__のビューがまだ設定されていない場合、このメソッドはビューをロードしますが、これはiOS> = 9.0でのみ利用可能です。あなたがiOS <9.0をサポートしているのであれば、それが全体像に入るとは思わないでください。

まだ設定されていない場合は、View Controllerのビューをロードします。

3。 viewDidLoadname __

viewDidLoadname__イベントは、ビューが作成されてメモリにロードされたときにのみ呼び出されますが、そのビューの境界はまだ定義されていません。これは、View Controllerが使用しようとしているオブジェクトを初期化するのに適した場所です。

ビューがロードされた後に呼び出されます。コードで作成されたView Controllerの場合、これは-loadViewの後です。ペン先からアーカイブされていないView Controllerの場合、これはビューが設定された後です。

4。 viewWillAppearname __

このイベントは、ビューが画面に表示されるたびにviewControllername__に通知します。この手順では、ビューに境界が定義されていますが向きは設定されていません。

ビューが表示されようとしているときに呼び出されます。デフォルトは何もしません。

5。 viewWillLayoutSubviewsname __

これが、ライフサイクルの最初のステップで、境界が確定します。拘束や自動レイアウトを使用していない場合は、ここでサブビューを更新したいと思うでしょう。これはiOS> = 5.0でのみ利用可能です。あなたがiOS <5.0をサポートしているなら、それでそれが絵に入ると期待しないでください。

View ControllerのビューのlayoutSubviewsメソッドが呼び出される直前に呼び出されます。サブクラスは必要に応じて実装できます。デフォルトはnopです。

6。 viewDidLayoutSubviewsname __

このイベントは、サブビューが設定されたことをView Controllerに通知します。サブビューを設定した後にサブビューを変更するのに適した場所です。これはiOS> = 5.0でのみ利用可能です。あなたがiOS <5.0をサポートしているなら、それでそれが絵に入ると期待しないでください。

View ControllerのビューのlayoutSubviewsメソッドが呼び出された直後に呼び出されます。サブクラスは必要に応じて実装できます。デフォルトはnopです。

7。 viewDidAppearname __

viewDidAppearname__イベントは、ビューが画面に表示された後に発生します。これは、バックエンドサービスまたはデータベースからデータを取得するのに適した場所です。

ビューが画面に完全に遷移したときに呼び出されます。デフォルトは何もしません

8。 viewWillDisappearname __

viewWillDisappearname__イベントは、提示されたviewControllername__のビューが他のviewControllername__の背後に表示されなくなる、却下される、隠される、または隠される直前に発生します。これは、ネットワークコールを制限したり、タイマーを無効にしたり、そのviewControllername__にバインドされているオブジェクトを解放したりするのに適した場所です。

ビューが閉じられたり、覆われたり、あるいは隠されたりしたときに呼び出されます。

9。 viewDidDisappearname __

これは、表示されているviewControllername__の表示が消えたり、却下されたり、隠されたり、隠されたりした直後に発生するイベントで、誰でも対処できるライフサイクルの最後のステップです。

ビューが却下された、覆われた、または別の方法で隠された後に呼び出されます。デフォルトは何もしません

Appleのように、このメソッドを実装するときには、その特定のメソッドのsupername__実装を呼び出すことを忘れないでください。

UIViewControllerをサブクラス化する場合は、NIBを使用していなくても、このメソッドのスーパー実装を呼び出す必要があります。指定されたNIBでは、File's Ownerプロキシは、そのクラスをビューアウトレット付きのView Controllerサブクラスに設定する必要があります(便宜上、デフォルトのinitメソッドがこれを行い、両方のメソッド引数にnilを指定します)。メインビューに接続されています。このメソッドをnil nib名で呼び出すと、このクラスの-loadViewメソッドは、自分のView Controllerのクラスと同じ名前のNIBをロードしようとします。そのようなNIBが実際には存在しない場合は、-setView:が呼び出される前に-viewを呼び出すか、プログラムでビューを設定するために-loadViewメソッドをオーバーライドする必要があります。

これが役に立ったことを願っています。ありがとう。

UPDATE - @ThomasWがコメント内で指摘したように、メインビューのサブビューがロードされるとき以外にもviewWillLayoutSubviewsname__とviewDidLayoutSubviewsname__が呼び出されます。テーブルビューまたはコレクションビューのセルが読み込まれます。

145
onCompletion

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では、デフォルトでビューがクリアされなくなります。

39
Rajamohan S

IOS 6以降。新しい図は次のとおりです。

enter image description here

28
Saad

メソッドviewWillLayoutSubviewsviewDidLayoutSubviewsは図には記載されていませんが、これらはviewWillAppearviewDidAppearの間で呼び出されます。それらは複数回呼び出すことができます。

19
gjgjgj

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's lifecycle diagram

詳細については、 UIViewControllerクラスリファレンス をご覧ください。

18
Alexey Pelekh

ここには、古くて不完全な情報がたくさんあります。 iOS 6以降の場合のみ:

  1. loadView[a]
  2. viewDidLoad[a]
  3. viewWillAppear
  4. viewWillLayoutSubviewsは、境界が最初に確定される時刻です。
  5. viewDidLayoutSubviews
  6. viewDidAppear
  7. *viewWillLayoutSubviews[b]
  8. *viewDidLayoutSubviews[b]

脚注:

(a) - didReceiveMemoryWarning中に手動でビューを削除した場合、loadViewviewDidLoadが再度呼び出されます。つまり、デフォルトでloadViewviewDidLoadは、View Controllerインスタンスごとに1回だけ呼び出されます。

(b)追加の回以上呼び出される場合があります。

16
bobics

Haiderの答えはiOS 6より前のバージョンでは正しいです。ただし、iOS 6以降はviewDidUnloadおよびviewWillUnloadが呼び出されることはありません。 docs 状態: "ビューはメモリ不足の条件下でパージされなくなり、このメソッドは呼び出されません。"

16
Matt Becker

公式ドキュメントで状態遷移を説明する: 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

10
Luismi

のとおり Appleのドキュメント - iOSアプリの開発を始める(Swift) - View Controllerの操作 - View Controllerのライフサイクルの理解

viewDidLoad():View Controllerのコンテンツビュー(ビュー階層の最上位)が作成され、ストーリーボードからロードされたときに呼び出されます。 …View Controllerに必要な追加設定を実行するには、この方法を使用します。

viewWillAppear():View Controllerのコンテンツビューがアプリケーションのビュー階層に追加される直前に呼び出されます。このメソッドを使用して、コンテンツビューが画面に表示される前に発生する必要がある操作をトリガします。

viewDidAppear():View Controllerのコンテンツビューがアプリケーションのビュー階層に追加された直後に呼び出されます。このメソッドを使用して、データの取得やアニメーションの表示など、ビューが画面に表示されたらすぐに発生する必要がある操作をトリガします。

viewWillDisappear():View Controllerのコンテンツビューがアプリケーションのビュー階層から削除される直前に呼び出されます。このメソッドを使用して、変更のコミットやファーストレスポンダのステータスの辞任などのクリーンアップタスクを実行します。

viewDidDisappear():View Controllerのコンテンツビューがアプリケーションのビュー階層から削除された直後に呼び出されます。このメソッドを使用して、追加の破棄アクティビティを実行します。

0
freddieoh