3

私が持っているこの問題を修正する方法、またはより良い実装設計についてのアドバイスはありますか?

要件

  • 前回のセッションでアプリケーションを終了する前に、アプリケーションの起動時にユーザーを前の詳細ページに移動させる方法が必要でした。
  • アプリのメイン画面にあった場合は、再起動時にここにとどまることができます
  • 私はUINavigationControllerで作業しており、メイン画面と詳細画面はUITableViewController上に構築されていると仮定しています

私の実装コンセプト

  • 「viewdidLoad」にチェックを入れて詳細画面かどうかを確認し、そうであればこちらへジャンプ(下記コード参照)

問題

  • 通常は正常に動作しますが、メモリ警告をトリガーすると、問題が発生し、ナビゲーションバーの奇妙な動作が発生します。たとえば、詳細ページのコンテンツ (UITableView) にいるように見えるときに、メイン ページのナビゲーション ボタンが表示されます。

私の分析

  • 詳細ページ (appointmentsListController) にいて、シミュレーターでメモリ警告が表示されたときに表示される内容から、次のように表示されます。

    (a)メインページ「viewDidLoad」が実際に呼び出されますが、これは私のコンセプトでは予期していなかったため、詳細ビュー(UINavigationController)から戻るボタンを押してメインビュー(RootViewController)に移動しましたが、実際には私のコードが実行され、ユーザーを詳細ページに戻そうとします

    (b) この時点の後、[AppointmentListController viewDidLoad] が以前の AppointmentListController dealloc メソッドが呼び出される前に呼び出されたように見えることをログに記録しました (つまり、コントローラー A にいたように、コントローラー B に戻りましたが、A にスローされました -そして、最初の部分の最初の解放は遅くまで開始されませんでした...)

  • ですから、私のアイデアがあまり素晴らしいものではないことは明らかだと思います

質問

私の要件をより適切に実装する方法について何か提案はありますか? (確認方法、どの方法で入れるか)

コード

- (void)viewDidLoad {
    [super viewDidLoad];

    // My Implementation of the Requirements which seems flawed in the case there is memory warning triggered 
    if ( previousSelectedScreen >= 0 ) {

        // Setup New Controller
        AppointmentListController *appointmentListController = [[AppointmentListController alloc] initWithNibName:@"AppointmentListController" bundle:nil];
        appointmentListController.screenToShow = previousSelectedScreen;

        // Push new view onto stack
        [[self navigationController] pushViewController:appointmentListController animated:NO];
        [appointmentListController release]; 
    } 

}
4

1 に答える 1

2

これが私が提案することです: このロジックをビュー コントローラーに含めるのではなく、アプリケーション デリゲートに含めます。ナビゲーション スタックを表示する前に構築することで、ナビゲーション バーなどで発生する可能性のある奇妙なことの一部を回避できます。メモリ警告を取り除くには、アプリがメモリを割り当てる方法を確認する必要がある場合があります。これを行うために。

とにかく、アプリケーションデリゲートで、ユーザーが終了したときに詳細ページにいたかどうかを確認するためのチェックを実行できます。そうであれば、ナビゲーション スタックを含む配列を作成できます (つまり、メイン画面 -> 詳細ページ)。setViewControllers次に、そのメソッドを使用して、これをナビゲーション コントローラーに渡すことができます。これが完了したら、ウィンドウを表示してアプリの起動を終了できます。

于 2011-06-05T10:39:15.007 に答える