web-dev-qa-db-ja.com

willMoveToParentViewController:とdidMoveToParentViewController:は正確に何をしますか?

IOS5と新しいUIViewController包含メソッドから始めて、これらのメソッドをaddChildViewController:removeFromParentViewController:およびtransitionメソッドと一緒に呼び出すことになっていることを私は知っています。また、3つのシナリオでそれらを呼び出す適切な順序も知っています。私が知らないのは、これらの方法が正確に何をするのかということです。

これらがUIViewControllerのサブクラスのオーバーライドポイントにすぎない場合、オーバーライドするときにsuperを呼び出す必要はないと思います。ビューコントローラを削除する前にwillMoveToParentViewController:nilを呼び出さないと、何がうまくいかない可能性がありますかdidMoveToParentViewController:self

20
konrad

言われたことに加えて、彼らはいくつかのデリゲートメソッドを呼び出します:

addChildViewController[child willMoveToParentViewController:self]を呼び出します

およびremoveFromParentViewController:[child didMoveToParentViewController:nil]を呼び出します

また、子ビューコントローラーの配列を保持するchildViewControllersプロパティを変更します。

13
Guillaume

これには多くの答えがあります:

  1. それらはそこにあり、常にパターンを維持するために、該当する場合はそれらを呼び出すことになっています。そうすれば、スーパークラスをUIViewControllerから独自のView Controllerに変更する場合、パターン全体をどこで実行したかを心配する必要はありません。

  2. addChildViewController:をオーバーライドするように全員に指示するよりも、接続するのに適した場所です。あなたが言うように、willMoveToParentViewController:の誤った管理は、特にsuperの呼び出しを忘れた場合、addChildViewController:の誤った管理よりも危険性が少ないように思えます。

  3. UIViewControllerは、おそらくパターンを支持するかどうかに依存します。 addChildViewController:を受信したことはわかっているが、他の2つのメッセージを受信して​​いない場合は、状態に一貫性がないと見なされる可能性があります。これがUIViewControllerが簿記をして完全なパターンを維持するように誘惑するために起こるのか、それとも実際にその内部状態を台無しにするのかは、楽しい推測ゲームですが、iOSリリースで変更される可能性もあります。物事はひどく壊れるかもしれません。そのため、Appleは、これを実行している限り、何があっても動作し続けることを通知するためのパターンがあります。

パターンに疑問を投げかけるのは良いことですが、パターンの骨への適合性をカットしようとすると、多くの潜在的な欠点があります。パターンがばかげて関与していない限り、通常はそれに準拠する方が簡単です。

1
Jesper