web-dev-qa-db-ja.com

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

viewDidLoadサブクラスのviewWillAppear vs. UIViewController:に割り当てられるタスクのタイプについて、私は常に少し不明確でした。

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

158
dugla

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

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

248
LeonBrussels

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

私の解決策:

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

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

この投稿 は、さまざまな方法とそれぞれで何が起こるかを非常によく説明しています。

現在、1回限りの初期化とポジショニングのために、フラグ付きでviewDidAppearを使用することを考えています。他に推奨事項がある場合はお知らせください。

10
keisar

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

enter image description here

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

viewDidLoad:どんな処理を行っても、一度だけ実行する必要があります。
viewWilLAppear:ページがロードされるたびに変更する必要のある処理。

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

4
Honey