0

に基づくアプリがありUINavigationControllerます。他の 9 つの「サブ画面」の 1 つにセグエする (ナビゲーション コントローラ スタックにプッシュする) ボタンを備えたメニュー画面があります。これらのサブ画面はいずれも、他の画面に続くものではありません。ユーザーが「サブ画面」にデータを入力し終わったら、元のメニュー画面に戻る完了ボタンを押すことができます。(これを想像するのが難しい場合は、1 つのルート ViewController と 9 つのリーフ ViewController があるストーリーボードのようなツリーを想像してください)。

さて、そのセットアップで、どのように機能するかについていくつか質問がありますviewDidLoad

~ まず、viewDidLoadサブ画面に遷移するたびに呼び出されるはずです。たとえば、メニュー画面からサブ画面「B」に移動し、メニュー画面に戻り、サブ画面「B」に戻ったとします。B のviewDidLoadメソッドを 2 回呼び出す必要がありますか? そうでない場合、なぜ私のものが2回呼び出されるのでしょうか?

~ 第二に、毎回呼び出されると仮定すると、サブスクリーンごとに一度だけ実行する必要がある長い操作がたくさんある場合はどうすればよいですか? それらをどこに配置すればよいですか (viewDidLoadユーザーがこのページとメニューの間を行き来し続けると、それらを配置すると複数回発生します)?

4

3 に答える 3

1

あなたの質問に答えるには:

  1. はい。通常、BのviewDidLoadメソッドは、UINavigationControllerのスタックにプッシュされるたびに呼び出す必要があります。これは、Bがスタックからポップされるたびに、通常は解放され、Bに移動するたびに、Bの新しいインスタンスが作成されるためです。

  2. この種の状況を処理する方法はたくさんあります。あなたが何をしようとしているのかを正確に見ずに、あなたにとって何が正しいのかを判断するのは難しいです。1つの方法は、処理を処理するシングルトンオブジェクトを作成することです。これがUIViewController内で処理するよりも優れている理由は、シングルトンはアプリケーションの存続期間を通じて存続できるのに対し、UIViewControllersは通常比較的短命であるためです。シングルトンオブジェクトは一度だけ作成でき、アプリケーションの存続期間を通じて永続化する必要のある操作とデータを管理できます。

于 2012-06-20T18:08:27.433 に答える
0

1. ビューが読み込まれると viewDidLoad が呼び出され、ビューが表示されると viewWillAppear が呼び出されます。

viewDidLoad が数回呼び出される場合、ビューを表示するたびにビューをロードし、ポップするたびに解放することを意味します。いくつかのコードを投稿すると、問題をよりよく特定するのに役立ちます。

あなたができることは次のようなものです:

「ルート」viewController クラスで、各「葉」ViewController をメンバーとして宣言し、それらが leafController1、leafController2 などと呼ばれ、それらの保持プロパティを作成するとします。

@interface YourRootViewController : UIViewController {
    LeafController1Class *leafController1;
    LeafController2Class *leafController2;
    // ...
}

@property (nonatomic, retain) LeafController1Class *leafController1;
@property (nonatomic, retain) LeafController2Class *leafController2;

// ...

@end

一番上のViewControllerのViewDidLoadで、「initWithNibName」などを使用してすべてのリーフコントローラーを初期化します(またはそれらを作成するために行っていることは何でも)。次のようにインスタンスを保持します。

self.leafController1 = [[[LeafController1Class alloc] initWithNibName:@"LeafController1NibName" bundle:nil] autorelease];

ユーザーがボタンを押すと、正しいリーフがナビゲーション コントローラーにプッシュされます。

[myNavigationController pushViewController:leafController1 animated:YES];

ここでリーフ コントローラーをポップすると、それらは保持されているため、メモリに保持されます。このようにして、ビューコントローラーの同じインスタンスを常にナビゲーションコントローラーにプッシュする限り、viewDidLoad はリーフごとに 1 回だけ呼び出されます。

2. ビューに関連する重いコードは、ビューがロードされたときに実行する必要があります。つまり、viewDidLoad によってトリガーされます。しかし、ViewController ではなく、UI とは別に、アプリケーションに関する情報を保持する他のクラスを保持することも良い考えです。負荷の高い計算は、バックグラウンドで行うか、アプリの初回読み込み時に行うことをお勧めします。

于 2012-06-20T18:42:27.220 に答える
0

viewWillAppearビューが表示されるたびに呼び出されます。viewDidLoadビューが構築されたときにのみ呼び出されます。たとえばinitFromNibNamed、ビューにアクセスしたときのビューコントローラー呼び出しの後などです。viewWillAppearビューコントローラーが表示されていなかったが表示されるといつでも呼び出されます-したがって、ビューコントローラーが押されると、viewWillAppearが呼び出されます。そのため、自分の が 2 回呼び出されていると思うかもしれませんviewDidLoadが、実際にはそうではない可能性があります。したがって、メソッドを に配置する必要がありますviewDidLoad。長い時間がかかることは何ですか?

于 2012-06-20T18:19:12.490 に答える