viewDidLoad
サブクラスのviewWillAppear
vs. UIViewController
:に割り当てられるタスクのタイプについて、私は常に少し不明確でした。
例えばUIViewController
サブクラスがサーバーにアクセスし、データを取得し、それをビューに送り、そのビューを表示するアプリを実行しています。 viewDidLoad
対viewWillAppear
でこれを行うことの長所と短所は何ですか?
viewDidLoadは、一度行う必要があるものです。 viewWillAppearは、ビューが表示されるたびに呼び出されます。 UILabelテキストの設定など、viewDidLoadで1回だけ行う必要があることを行う必要があります。ただし、ユーザーがビューを表示するたびに、ビューの特定の部分を変更したい場合があります。 iPodアプリケーションは、「Now Playing」ビューに移動するたびに歌詞を一番上にスクロールします。
ただし、サーバーからものをロードするときは、待ち時間についても考慮する必要があります。すべてのネットワーク通信をviewDidLoadまたはviewWillAppearにパックすると、ユーザーがビューを見る前に実行されます。これにより、アプリが短時間フリーズする可能性があります。ある種のアクティビティインジケータを備えた未実装のビューを最初にユーザーに表示することをお勧めします。ネットワーキングが完了したら、1、2秒かかります(または失敗することもあります-誰が知っていますか?)、ビューにデータを入力できます。これがどのように行われるかについての良い例は、さまざまなTwitterクライアントで見ることができます。たとえば、Twitterrificで著者詳細ページを表示すると、ネットワーククエリが完了するまで、ビューには「読み込み中...」と表示されます。
最初は、tableViewでViewDidLoadのみを使用しました。 Wifiが失われたテストで、デバイスを機内モードに設定することで、Wifiの復帰時にテーブルが更新されないことがわかりました。実際、-Info.plistでバックグラウンドモードをYESに設定してホームボタンを押しても、デバイスのtableViewを更新する方法はないようです。
私の解決策:
-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}
配置にviewDidLoadを使用することは少し危険であり、境界が設定されていないため、避ける必要があることに注意することが重要です。これは予期しない結果を引き起こす可能性があります(さまざまな問題がありました...)
この投稿 は、さまざまな方法とそれぞれで何が起こるかを非常によく説明しています。
現在、1回限りの初期化とポジショニングのために、フラグ付きでviewDidAppearを使用することを考えています。他に推奨事項がある場合はお知らせください。
依存します、ビューを開くたびにデータをロードする必要がありますか各?またはonce?
viewDidLoad:
どんな処理を行っても、一度だけ実行する必要があります。viewWilLAppear:
ページがロードされるたびに変更する必要のある処理。
ラベル、アイコン、ボタンのタイトル、またはほとんどのdataInputedByDeveloper 通常は変更されません。名前、写真、リンク、ボタンステータス、リスト(tableViewsまたはcollectionViewの入力配列)またはほとんどのdataInputedByUser 通常は変更を行います。