UIViewController viewDidLoad対viewWillAppear:適切な分業は何ですか?


164

私はいつもに割り当てる必要があるタスクの種類のビットが不明確となっているviewDidLoadviewWillAppear中:UIViewControllerサブクラス。

たとえば、UIViewControllerサブクラスでサーバーにアクセスし、データを取得してビューにフィードし、そのビューを表示するアプリを実行しています。viewDidLoad対これを行うことの長所と短所は何viewWillAppearですか?

回答:


251

viewDidLoadは、一度行う必要があることです。viewWillAppearは、ビューが表示されるたびに呼び出されます。UILabelテキストを設定するなど、viewDidLoadで一度だけ実行する必要があることを行う必要があります。ただし、ユーザーが表示するたびにビューの特定の部分を変更したい場合があります。たとえば、「Now Playing」ビューに移動するたびに、iPodアプリケーションが歌詞を上にスクロールして戻します。

ただし、サーバーからデータを読み込む場合は、遅延についても考慮する必要があります。すべてのネットワーク通信をviewDidLoadまたはviewWillAppearにパックすると、ユーザーがビューを表示する前にそれらが実行され、アプリが短時間フリーズする可能性があります。最初に、ある種のアクティビティインジケータを含む未入力のビューをユーザーに表示することをお勧めします。1〜2秒かかる可能性がある(または失敗する可能性もあります-だれが知っているか)ネットワークの使用が終了したら、ビューにデータを入力できます。これを行う方法の良い例は、さまざまなTwitterクライアントで見ることができます。たとえば、著者の詳細ページをTwitterrificで表示すると、ネットワーククエリが完了するまで、ビューには「読み込み中...」としか表示されません。


したがって、viewWillAppearが繰り返し呼び出される可能性があります。たとえば、viewcontrollersビューが非表示にされた後で表示された場合(つまり、UIViewの非表示メソッドではなく、ここで隠されている場合)、そのメソッドが起動しますか?どのシーンで、viewDidLoadの呼び出しが先行せずにviewWillAppearが呼び出されますか?
dugla

7
viewDidLoadは、ビューの構築時にのみ呼び出されます。たとえば、ビューがアクセスされたときのビューコントローラーのinitFromNibNamed呼び出しの後などです。viewWillAppearは、ビューコントローラーが表示されていなかったときに表示されるときに呼び出されます。そのため、ビューコントローラーが押されると、viewWillAppearが呼び出されます。そこから別のサブビューをプッシュしてユーザーが戻ると、viewWillAppearが再度呼び出されます。
Kendall Helmstetter Gelner、

ケンダルに感謝します。ええ、戦略的に配置されたいくつかのNSLogが私を分類しました。viewWillAppear / viewWillDissappearは、ビューコントローラのプッシュ/ポップで発火します。
デュグラ2009年

3
ビューが非表示の場合、viewDidLoadも呼び出され、メモリ関連の理由でアンロードされた後、再び表示されることに注意してください。信頼できるもの:viewDidLoadは、ビューが最初に作成されたときに少なくとも1回呼び出され、ビューが非表示になった後に再び表示されるときには、さらに多くの回数呼び出されます。viewWillAppearは、ビューが画面に表示されようとしているときに常に呼び出されます。
DanM 2013年

2
誰かがこれらの2つの関連する質問についてさらにコメントしてください。(2)splitViewControllerのdetailView(iPad)用のAppleのテンプレートには、configureViewメソッドがあります-viewDidLoadおよびViewWillAppearに関連して何を入力する必要がありますか?
ジェフ

12

最初はtableViewでViewDidLoadのみを使用していました。Wifiの損失を伴うテストで、デバイスを機内モードに設定すると、Wifiの返却によってテーブルが更新されないことがわかりました。実際、-Info.plistでバックグラウンドモードをYESに設定してホームボタンを押しても、デバイスのtableViewを更新する方法はないようです。

私の解決策:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}

10

配置にviewDidLoadを使用することは少し危険であり、境界が設定されていないので避ける必要があることに注意することが重要です。これは予期しない結果を引き起こす可能性があります(私はさまざまな問題を抱えていました...)

この投稿では、さまざまな方法と、それぞれの方法で何が発生するかについて説明しています。

現在、1回限りの初期化と配置のために、フラグを指定してviewDidAppearを使用することを考えています。他に推奨事項がある場合は、お知らせください。


これに同意する:「...境界が設定されていないので回避する必要があります...」
danisupr4

4

依存しますが、ビューを開くたびにデータをロードする必要がありますか?または一度だけ

ここに画像の説明を入力してください

  • 赤:毎回変更する必要はありません。ロードされると、元の状態のままになります。
  • 紫:時間とともに、または毎回ロードした後に変更する必要があります。同じ3人の推奨ユーザーがフォローするのを見たくないので、画面に戻るたびに再読み込みする必要があります。彼らの写真は更新されるかもしれません...あなたは5年前の写真を見たくありません...

viewDidLoad: どのような処理であっても、一度行う必要があります。
viewWilLAppear:ページが読み込まれるたびに変更する必要がある処理。

ラベル、アイコン、ボタンのタイトル、またはほとんどのdataInputedByDeveloper は通常変更されません。名前、写真、リンク、ボタンのステータス、リスト(tableViewsまたはcollectionViewの入力配列)またはほとんどのdataInputedByUser は通常変更されます。


紫はviewWillAppearではなくviewDidAppearで呼び出されます
Alex

@AlexKornhauserどういう意味ですか?私はあなたviewWillAppearの中で最新のつぶやきをクエリして確認できると言っています。viewDidAppearそれには遅すぎる
Honey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.