-viewWillAppear:と-viewDidAppear:の違いは何ですか?


131

違いは何である-[UIViewController viewWillAppear:]とは-[UIViewController viewDidAppear:]


1
BoltClockに感謝しますが、可能であれば両方の例を挙げてください。–
PJR

3
@BoltClockそれが本当ならそれはいいだろう。賛成して15人がメソッド名を読んだが、実際には測定しなかったと思います...これはGoogleから来ました。違いはないためです
Adam

1
具体的には、parentView.viewDidAppearは、Appleが実際にparentViewを表示する前に長時間呼び出されます... Appleは最初に(原子的に)すべてのサブビューを描画します...そして、多くのサブビューまたは複雑なビューがある場合、「viewDidAppear」は数十と呼ばれます。あるいは数百ミリ秒もすぐ:(。
アダム

回答:


292

一般的に、これは私がすることです:

1)ViewDidLoad-ビューと一緒に表示する必要があるビューにコントロールを追加するときはいつでも、すぐにそれをViewDidLoadメソッドに入れます。基本的に、このメソッドは、ビューがメモリに読み込まれるたびに呼び出されます。たとえば、ビューが3つのラベルを持つフォームの場合、ここにラベルを追加します。これらのフォームがなければ、ビューは存在しません。

2)ViewWillAppear:通常、フォームのデータを更新するためだけにViewWillAppearを使用します。したがって、上記の例では、これを使用して実際にドメインからフォームにデータをロードします。UIViewsの作成にはかなりのコストがかかります。ViewWillAppearメソッドでこれを行うことはできるだけ避けてください。これが呼び出されたときは、iPhoneがUIViewをユーザーに表示する準備ができていること、およびここで重いことを実行していることを意味します。非常に目に見える形でパフォーマンスに影響します(アニメーションが遅れるなど)。

3)ViewDidAppear:最後に、ViewDidAppearを使用して、たとえば上記のフォームの追加データを取得するためにwebservice呼び出しを実行するなど、実行に時間がかかるものへの新しいスレッドを開始します。すでに存在し、ユーザーに表示されている場合は、データを取得する間、ユーザーに素敵な「待機中」メッセージを表示できます。


4
申し訳ありませんが、「ドメインからデータをフォームにロードする」とはどういう意味viewWillAppearですか?ネットワーク経由でダウンロードするということですか?しかし、あなたもダウンロードのものを勧めますviewDidAppearか?
Philip007

1
@ Philip007 Stackがこのタイプのドメインを参照していると思います:en.wikipedia.org/wiki/Domain-specific_modeling。データはモデルなどから読み込まれます。
dentarg 2012

2
この答えはドキュメントにあるはずです。3つの方法の違いを明らかにするのにとても役立ちました。ありがとうございました!
GangstaGraham 2013年

1
+1私はこれら3つの違いを理解するのに少し混乱していましたが、あなたはそれを完全にクリアしました@ChetanBhalara
Chisx

@ChetanBhalaraですが、長時間の作業ViewDidAppearを行うと、UIについてユーザーが混乱しやすくなります:)
hqt

46

viewDidLoad === >>>ここに初期化コードを配置します。ビューのライフサイクル中に変化する可能性のある動的データを置かないでください。したがって、コアデータからデータを取得する場合、ビューの存続期間中に変更される可能性があるので、ここでは実行しないでください。たとえば、タブコントローラがあるとします。tab1からtab2に切り替えて、tab2のモデルで何かを変更します。tab1に戻り、モデルコードがviewDidLoadで実行された場合、これは更新されません(KVOやNSFetchedResultsControllerなどを使用していない場合)。

viewWillAppear === >>>これは、ビューがすでにメモリにあるかどうかに関係なく、ビューが表示される直前に呼び出されます。モデルロジックなどの動的コードをここに配置します。

viewDidAppear === >>>ネットワークコールなど、ビューが画面上にあることが確実である場合にのみ実行したい高価な操作をここに配置します。

注意:アプリがバックグラウンドでフォアグラウンドに戻った場合は、NSNotificationCenterを使用してこれを処理する必要があります。そのためのコードを以下のコメントに書きました。viewWillAppear / viewDidAppearが起動すると思うかもしれません。そこにブレークポイントを設定してテストします。発火しません。そのため、バックグラウンドでアプリの変更があった場合は、通知を使用して更新する必要があります。


1
ViewWillまたはViewDidは、アプリケーションを最小化するたびに実行されますか?
Jeef 14

2
@Jeefこれは素晴らしい質問です。バックグラウンドでアプリがシステムまたはユーザーによって強制終了されない限り、どちらも実行されません。アプリが最小化されていないときに通知を受け取るには、NSNotificationCenterとaddObserverを使用して、UIApplicationWillEnterForegroundNotificationという名前を付ける必要があります。セレクターはapplicationWillEnterForegroundである必要があります。NSNotificationパラメーターがあります。データをリロードするなどの方法でコードをそのメソッドに配置します。実行できることは、このメソッドから呼び出すリロードメソッドを作成し、同じにする必要がある場合はviewDidAppearを作成することです。
smileBot

2
@Jeefのようなもの:-(void)viewDidLoad {[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground :) name:UIApplicationWillEnterForegroundNotification object:nil]; }-(void)applicationWillEnterForeground:(NSNotification *)notif {//ここで何でも応答する}
smileBot

12

このviewWillAppearメソッドは、実際のビューをロードする前に呼び出されます。

このviewDidAppearメソッドは、ビューがすでにロードされていて、何かを表示したいときに呼び出されます。


9

viewWillAppear:
■ビューは、Windowsのビュー階層に追加される前に呼び出さ
■[vc.view layoutSubviews](必要な場合)前に呼び出され
viewDidAppear
■ビューは、ビュー階層に追加された後に呼び出さ
■[vc.viewのlayoutSubviews]後に呼び出されます(必要であれば)


7

いくつかの観察:

  • このviewDidLoadメソッドは、ビューが最初にインスタンス化されるときに呼び出されます。IBOutlet参照は、これが呼び出されたときまでにフックされますが、前にはフックされません。frameビューのは、しかし、これが呼び出された時点で確立されない場合があります。これは、サブビューとそれに関連する制約を追加/構成するのに最適な場所です。ただしframe、メインビューのディメンションに基づいて手動で値を構成している場合、それらのフレームの構成はまたはまで延期するviewWillAppear必要がありviewDidLayoutSubviewsます。

  • このviewWillAppearメソッドは、ビュー階層内のビューのプレゼンテーションが開始される直前に呼び出されます。特に、これはビューのプレゼンテーションのアニメーション(存在する場合)の開始時に呼び出されます。その仲間は、viewWillDisappearこのビューからの移行が始まるときに明らかに呼び出されます。

  • このviewDidAppearメソッドは、特に関連するアニメーションがすべて終了したときに、ビューのプレゼンテーションが完了したときに呼び出されます。そのコンパニオンは、viewDidDisappearこのビューからの移行が完了したときに呼び出されます。

2つの重要な警告:

  • viewDidLoadビューが最初にインスタンス化されるときに、一度だけ呼び出されます。一方、viewWillAppearおよびviewDidAppearビューが最初に提示されていないときにのみ呼び出さが、後続のすべての時間は、問題の同じビューを再提示されます。たとえば、最初にビューを表示すると、これら3つのメソッドすべてが呼び出されます。問題のビューが後で別のビューを提示し、その後それを非表示にした場合、viewWillAppearおよびviewDidAppearは通常、問題のビューがビュー階層に追加されてアニメーション化されたときに再び呼び出されますが、呼び出されviewDidLoadません。viewDidLoadこの特定のインスタンスが最初に作成されたときにのみ呼び出されます。

    したがって、ビューが再表示されるたびに何かを実行したい場合は(たとえば、ビューを閉じるか、ポップバックするなど)、viewWillAppearまたはで実行しviewDidAppearます。ビューが最初にインスタンス化されたときにのみ発生するようにするには、で行いますviewDidLoad

  • の呼び出しはviewWillAppear、そのビューへの移行が完了することを保証するものではありません。特に、リアルタイムのユーザー入力によって駆動されるインタラクティブトランジションを使用している場合、そのインタラクティブトランジションはキャンセルできます。つまりは、という理由だけでviewWillAppear呼ばれて、それはそれが意味するものではありませんviewDidAppearと呼ばれます。通常はそうですが、インタラクティブなジェスチャーがキャンセルされた場合は、キャンセルされません(遷移が完了していないため)。

    WWDC 2013では、インタラクティブな遷移のコンテキストで、プレゼンターviewWillAppearが「viewMightAppear、またはviewWillProbablyAppear、またはiReallyWishThisViewWouldAppear」に名前を変更する必要があると冗談を言っていました。

    組み込みのインタラクティブジェスチャの例として、を使用しUINavigationControllerて「左端からスワイプ」してビューのポップを開始する場合があります。viewWillAppearあなたが飛び出るされたビューのために呼び出されますが、あなたは、あなたがこのポップジェスチャーを開始したビューに戻りすること「左端からスワイプ」をキャンセルした場合、ポップはキャンセルされ、viewDidAppear表示のためにあなたがし始めましたpop backが呼び出されることはありません。

    これの最終的な効果は、へのすべての呼び出しのviewWillAppear後に最終的にへの呼び出しが続くと想定するコードを記述しないように注意する必要があることですviewDidAppear。移行がキャンセルされた場合、これは当てはまりません。


5

viewwillappearはビューをロードする前に呼び出されるため、ビューをロードする前に特定のタスクを実行でき、viewdidappearはビューをロードした後に呼び出されるため、postタスクはそのメソッドで実行されます


4

「will」と「did」の違い...名前が示すように、ビューが表示されようとする前にviewWillAppearが呼び出され、ビューが表示されたときにviewDidAppearが呼び出されます。


70以上の賛成票が含まれている、承認済みの回答ブロを見てください。:)
PJR 2013

4

1)ViewWillAppear:メモリに実際に読み込まれたビュー。ビューコントローラで一度呼び出され、そのフレームがありましたが、それでもユーザーには表示されませんでした。

2)ViewDidAppear:次のコントローラーに提示できるように、ビュー階層に追加されたコントローラー、また、ビューはサブビューをレイアウトしました



3

総括する:

-viewWillAppear->データを更新(テーブルビューからデータを再読み込み)

-viewDidAppear->負荷の高い操作(すてきな進捗状況のAPI呼び出し!)


1

名前が示すように、viewWillAppearはビューが表示される直前にviewDidAppear呼び出され、ビューが表示されたときに呼び出されます。


0

ユースケース、つまり、いつどちらを使用すればよいですか?

viewDidLoad -ラベル、ボタン(つまり、任意のコントロール/サブビュー)がビューのインターフェースファイルに接続されている場合、およびこれらすべてをViewControllerのビューと同時にロードしたい場合、およびこれを一度メモリにロードしたい場合それで終わりました

viewWillAppear-たとえば、viewControllerが画面に表示されるたびにビューの背景色を変更するとします。または、より現実的には、夜間のDarkModeの背景色と、昼間の背景ビューの明るい色が必要な場合は、次のコードを使用してください。viewWillAppear

別の良いユースケースはこちら https://stackoverflow.com/a/39395865/5438240

また、Navigation stack(UINavigationController)を使用している場合、ポップされようviewWillDisappear()としているviewControllerが呼び出され、次にスタックの一番上にあるViewControllerがviewWillAppear()呼び出されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.