0

アプリケーションで UITableViewController を使用しています。テーブルビューコントローラーからバックにポップしている間、nilをテーブルビューに設定して、メモリからビューコントローラーの割り当てを解除していました。再びviewDidLoadを呼び出しています。なぜそれが起こっているのか説明してください。

-(void)handleBackButton{
        self.tableView=nil;
        [self.navigationController popViewControllerAnimated:YES];
}
4

1 に答える 1

1

ブレークポイントを設定viewDidLoadし、スタック トレースを調べて、ビューをリロードしている理由を確認できます。

しかし、私は経験に基づいた推測をすることができます。ナビゲーション コントローラーにビュー コントローラーをポップするように指示する場合、そのビュー コントローラーをview画面外にアニメーション化する必要があります。そうするために、おそらく、消えるView Controllerにそのview.

A UITableViewController'sviewはその と同じtableViewです。に設定tableViewするとnil、 にも設定さviewnilます。そのため、Navigation Controller が Table View Controller にview(ビューを画面外にアニメーション化できるように) 要求すると、Table View Controller はそれviewが nil であることを認識し、そのビューをロードします。ビューをロードするには、自分自身を送信しloadView、次に自分自身を送信しますviewDidLoad

ビューをアンロードしようとするのが本当に面倒な理由がわかりません。ビュー コントローラー自体の割り当てが解除されると、そのビューが解放されます (別の場所に保持していない限り、ビューの割り当てが解除されます)。また、View Controller の割り当てが解除されない場合、それは通常、そのビューをすぐに画面に戻したいからではないでしょうか?

とにかく、本当にビュー コントローラーのビューを削除したい場合は、ビューがまだ画面上のビュー階層にある可能性がある間は、そのビューviewをに設定しないでください。nilビューが確実に階層から外れるまで待ちます。たとえば、 subclassUITableViewControllerと overridedidMoveToParentViewController:は次のようになります。

- (void)didMoveToParentViewController:(UIViewController *)parentViewController {
    [super didMoveToParentViewController:parentViewController];
    if (parentViewController == nil) {
        self.tableView = nil;
    }
}
于 2013-08-08T06:56:41.513 に答える