質問

Navigation Controllerにプッシュされ、Navigation Controllerビューからポップされたときにオブジェクトを解放するだけで、ビューのフィールドを更新するようにView Controllerを設定するにはどうすればよいですか。

私の目標は、View Controllerのことです:

  1. ナビゲーションコントローラースタックにプッシュされたときにのみ表示を更新する
  2. データがNavigation Controllerスタックからポップされるとデータをリリースします
  3. 可能な限りコントローラーを再利用します(xibファイルのロード/アンロードのオーバーヘッドを排除するため)

viewWillBePushed:および viewWillBePopped:のデリゲートメソッドはありますか?

ビューの3つのレイヤーがあるとしましょう:

Movies (MovieListController)
   --> Movie Basic Info (MovieInfoController)
        --> Movie Credits (MovieCreditsController)

各映画を表すクラス Movie があると仮定します。

ここでは、3つの UIViewController のみを持ち、プログラムのランタイムにそれぞれ1つのインスタンスを作成します。したがって、同じ MovieInfoController を異なる映画に再利用でき、同様に MovieCreditsController を再利用できます。

ただし、 MovieInfoController も、スタックにプッシュされた場合にのみビューフィールド(タイトル、リリース日など)を更新するようにします。 viewWillAppear に表示を実装すると、 MovieCreditsController がポップされた場合でも、強制的にフィールドを更新します。

また、 MovieInfoController がポップされたときに Movie への参照と、潜在的に大きなオブジェクト(カバーイメージなど)を解放するようにします。 viewWillDisappear にこのロジックを実装すると、スタック上の MovieCreditsController をプッシュするときにデータが解放されます。

合理的ですか?私はそれについて間違った方法で行っていますか?

役に立ちましたか?

解決

Movieオブジェクトを作成したため、そこに90%います。 MovieListControllerは、単一のMovieInfoControllerを所有する必要があります。 Navigation Controllerにプッシュする前に、 -setMovie:を呼び出す必要があります。 -setMovie:への呼び出しは、フィールドを更新するものでなければなりません。

同様に、MovieInfoControllerは単一のMovieCreditsControllerを所有し、navコントローラーにプッシュする前に -setMovie:を呼び出す必要があります。

MovieListControllerおよびMovieInfoControllerでは、 -viewDidAppear: [subController setMovie:nil] を呼び出してメモリを解放できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top