ブレークポイントを設定viewDidLoad
し、スタック トレースを調べて、ビューをリロードしている理由を確認できます。
しかし、私は経験に基づいた推測をすることができます。ナビゲーション コントローラーにビュー コントローラーをポップするように指示する場合、そのビュー コントローラーをview
画面外にアニメーション化する必要があります。そうするために、おそらく、消えるView Controllerにそのview
.
A UITableViewController
'sview
はその と同じtableView
です。に設定tableView
するとnil
、 にも設定さview
れnil
ます。そのため、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;
}
}