UIViewController
に関するAppleのドキュメントにはこう書かれています:
独自のコンテナービューコントローラーを実装する場合は、removeFromParentViewController
メソッドを呼び出す前に子ビューコントローラーのwillMoveToParentViewController:
メソッドを呼び出して、親の値nilを渡す必要があります。
カスタムコンテナーがaddChildViewController:
メソッドを呼び出すと、追加する前に、子として追加するビューコントローラーのwillMoveToParentViewController
:メソッドが自動的に呼び出されます。
独自のコンテナービューコントローラーを実装する場合は、新しいコントローラーへの遷移が完了した後、または遷移がない場合はdidMoveToParentViewController:
メソッドを呼び出した直後に、子ビューコントローラーのaddChildViewController:
メソッドを呼び出す必要があります。
removeFromParentViewController
メソッドは、子を削除した後、子ビューコントローラーのdidMoveToParentViewController:
メソッドを自動的に呼び出します。
これらのメソッドを呼び出す必要があるのはなぜですか?それらの方法は何をしますか?
ProfileViewController *profile = [[ProfileViewController alloc] init];
profile.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self addChildViewController:profile];
[self.view addSubview:profile.view];
[profile didMoveToParentViewController:self];
最後の行を削除しても、コードは完全に機能します。誰かがこれで私を助けてくれますか?
これらのメソッドが使用されるのは、子ビューコントローラを追加または削除するときに従うべき規則であるためです。子ビューコントローラを追加する前に、willMoveToParentViewController
メソッドを最初に呼び出し、次にdidMoveToParentViewController
メソッドを呼び出す必要があります。子ビューコントローラーを親ビューコントローラーから削除している間、これらのメソッドは逆の順序で呼び出されます。
addChildViewController:
は自動的に[child willMoveToParentViewController:self]
を呼び出します。したがって、addChildViewController:
の後にdidMoveToParentViewController
を呼び出す必要があります。同様に、removeFromParentViewController:
は自動的に[child didMoveToParentViewController:nil]
を呼び出します。したがって、willMoveToParentViewController:
の前にremoveFromParentViewController:
を呼び出す必要があります
基本的に、それらはインターフェースで気付くことができることは何もしません。 「しかし、どのサブクラスでもそれらのオーバーライドが許可されているため、それらを呼び出さない場合、裸のUIViewControllerを壊すことはありませんが、それに依存するサブクラスを壊すことになります(たとえば、サブクラスがオブジェクトを解放しようとしているとしましょう。親のビューコントローラーから削除されたときに、メソッドを呼び出さない場合、オブジェクトは解放されません)。」コメントで説明したように here です。