web-dev-qa-db-ja.com

didMoveToParentViewControllerおよびwillMoveToParentViewController

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];

最後の行を削除しても、コードは完全に機能します。誰かがこれで私を助けてくれますか?

18
Arun

これらのメソッドが使用されるのは、子ビューコントローラを追加または削除するときに従うべき規則であるためです。子ビューコントローラを追加する前に、willMoveToParentViewControllerメソッドを最初に呼び出し、次にdidMoveToParentViewControllerメソッドを呼び出す必要があります。子ビューコントローラーを親ビューコントローラーから削除している間、これらのメソッドは逆の順序で呼び出されます。

addChildViewController:は自動的に[child willMoveToParentViewController:self]を呼び出します。したがって、addChildViewController:の後にdidMoveToParentViewControllerを呼び出す必要があります。同様に、removeFromParentViewController:は自動的に[child didMoveToParentViewController:nil]を呼び出します。したがって、willMoveToParentViewController:の前にremoveFromParentViewController:を呼び出す必要があります

22
Arun

基本的に、それらはインターフェースで気付くことができることは何もしません。 「しかし、どのサブクラスでもそれらのオーバーライドが許可されているため、それらを呼び出さない場合、裸のUIViewControllerを壊すことはありませんが、それに依存するサブクラスを壊すことになります(たとえば、サブクラスがオブジェクトを解放しようとしているとしましょう。親のビューコントローラーから削除されたときに、メソッドを呼び出さない場合、オブジェクトは解放されません)。」コメントで説明したように here です。

2