違いは何である-[UIViewController viewWillAppear:]
とは-[UIViewController viewDidAppear:]
?
違いは何である-[UIViewController viewWillAppear:]
とは-[UIViewController viewDidAppear:]
?
回答:
一般的に、これは私がすることです:
1)ViewDidLoad-ビューと一緒に表示する必要があるビューにコントロールを追加するときはいつでも、すぐにそれをViewDidLoadメソッドに入れます。基本的に、このメソッドは、ビューがメモリに読み込まれるたびに呼び出されます。たとえば、ビューが3つのラベルを持つフォームの場合、ここにラベルを追加します。これらのフォームがなければ、ビューは存在しません。
2)ViewWillAppear:通常、フォームのデータを更新するためだけにViewWillAppearを使用します。したがって、上記の例では、これを使用して実際にドメインからフォームにデータをロードします。UIViewsの作成にはかなりのコストがかかります。ViewWillAppearメソッドでこれを行うことはできるだけ避けてください。これが呼び出されたときは、iPhoneがUIViewをユーザーに表示する準備ができていること、およびここで重いことを実行していることを意味します。非常に目に見える形でパフォーマンスに影響します(アニメーションが遅れるなど)。
3)ViewDidAppear:最後に、ViewDidAppearを使用して、たとえば上記のフォームの追加データを取得するためにwebservice呼び出しを実行するなど、実行に時間がかかるものへの新しいスレッドを開始します。すでに存在し、ユーザーに表示されている場合は、データを取得する間、ユーザーに素敵な「待機中」メッセージを表示できます。
viewWillAppear
ですか?ネットワーク経由でダウンロードするということですか?しかし、あなたもダウンロードのものを勧めますviewDidAppear
か?
ViewDidAppear
を行うと、UIについてユーザーが混乱しやすくなります:)
viewDidLoad === >>>ここに初期化コードを配置します。ビューのライフサイクル中に変化する可能性のある動的データを置かないでください。したがって、コアデータからデータを取得する場合、ビューの存続期間中に変更される可能性があるので、ここでは実行しないでください。たとえば、タブコントローラがあるとします。tab1からtab2に切り替えて、tab2のモデルで何かを変更します。tab1に戻り、モデルコードがviewDidLoadで実行された場合、これは更新されません(KVOやNSFetchedResultsControllerなどを使用していない場合)。
viewWillAppear === >>>これは、ビューがすでにメモリにあるかどうかに関係なく、ビューが表示される直前に呼び出されます。モデルロジックなどの動的コードをここに配置します。
viewDidAppear === >>>ネットワークコールなど、ビューが画面上にあることが確実である場合にのみ実行したい高価な操作をここに配置します。
注意:アプリがバックグラウンドでフォアグラウンドに戻った場合は、NSNotificationCenterを使用してこれを処理する必要があります。そのためのコードを以下のコメントに書きました。viewWillAppear / viewDidAppearが起動すると思うかもしれません。そこにブレークポイントを設定してテストします。発火しません。そのため、バックグラウンドでアプリの変更があった場合は、通知を使用して更新する必要があります。
このviewWillAppear
メソッドは、実際のビューをロードする前に呼び出されます。
このviewDidAppear
メソッドは、ビューがすでにロードされていて、何かを表示したいときに呼び出されます。
いくつかの観察:
この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
。移行がキャンセルされた場合、これは当てはまりません。
1)ViewWillAppear:メモリに実際に読み込まれたビュー。ビューコントローラで一度呼び出され、そのフレームがありましたが、それでもユーザーには表示されませんでした。
2)ViewDidAppear:次のコントローラーに提示できるように、ビュー階層に追加されたコントローラー、また、ビューはサブビューをレイアウトしました
前者はビューが表示される前に発生し、後者はその後に発生します。
ユースケース、つまり、いつどちらを使用すればよいですか?
viewDidLoad
-ラベル、ボタン(つまり、任意のコントロール/サブビュー)がビューのインターフェースファイルに接続されている場合、およびこれらすべてをViewControllerのビューと同時にロードしたい場合、およびこれを一度メモリにロードしたい場合それで終わりました
viewWillAppear
-たとえば、viewControllerが画面に表示されるたびにビューの背景色を変更するとします。または、より現実的には、夜間のDarkModeの背景色と、昼間の背景ビューの明るい色が必要な場合は、次のコードを使用してください。viewWillAppear
別の良いユースケースはこちら https://stackoverflow.com/a/39395865/5438240
また、Navigation stack(UINavigationController
)を使用している場合、ポップされようviewWillDisappear()
としているviewControllerが呼び出され、次にスタックの一番上にあるViewControllerがviewWillAppear()
呼び出されます。