2013-01-04 16 views
17

子ビューコントローラは、子ビューコントローラの実装内で、次のコードによって削除されます。子ビューコントローラが自身を削除したことを親ビューコントローラに通知する方法はありますか?

- (void)commandFinishVC 
{ 
    [ self.view removeFromSuperview]; 
    [ self removeFromParentViewController ]; 
} 

子ビューコントローラとそのビューが正常に削除されますが、どのように親がこの通知され? -viewDidDisAppearは呼び出されず、-viewDidUnloadは推奨されなくなりました。

私が見つけることができる例から、親ビューコントローラは削除される子を指定するイベントの発信元であるとみなされますが、(私にとって)子供は完成のために自立していなければなりません。

親ビューコントローラでself.parentViewControllerプロパティを使用し、次のようなものを使用してremoveメソッドを呼び出す必要がありますか?

- (void)commandFinishVC 
{ 
    [ childVC.view removeFromSuperview]; 
    [ childVC removeFromParentViewController ]; 
} 

答えて

25

はい、親コントローラは、子コントローラの追加と削除を制御する必要があります。 UIViewControllerクラスリファレンスのImplementing a Container View Controllerセクションを参照してください。

私はあなたの子供が自分自身を削除して、あなたの前者のアプローチ、と逃げる可能性が疑われるが、Appleはそのドキュメントの一貫性があるとImplementing UIViewController ContainmentのWWDC 2011のセッションは、コンテナコントローラが子供を管理するための責任を負うことを言います。

したがって、子供が削除されたことを子供に知らせる方法についてのあなたの質問に答えて、そのための確立されたプロトコルはありません。しかし、親がこのプロセスを開始すると推定されるため、これは驚くべきことではありません。また、このプロセスを開始する必要がある限り、ドキュメントには、親が子コントローラを管理するための公開APIを持つ必要があることが示唆されています。

親に通知する子供のためのプロトコルはありませんが、親コントローラが移動/削除されたことを子供に知らせる公開APIがあります。具体的には、親コントローラが子を削除しているときは、willMoveToParentViewControllerを呼び出す必要があります。 This documentationは、明示的に、我々は、この通知を行わなければならないことを言う:

独自のコンテナビューコントローラを実装している場合、それはremoveFromParentViewControllerメソッドを呼び出す前に、子ビューコントローラのwillMoveToParentViewController:メソッドを呼び出す必要があります...

[childVC willMoveToParentViewController:nil]; 
[childVC.view removeFromSuperview]; 
[childVC removeFromParentViewController]; 
ビューコントローラプログラミングガイドのAdding and Removing a Childセクション、子を削除するとき、我々がすべきで述べたようにこのよう

didMoveToParentViewControllerのドキュメントも同様です。子コントローラを追加するときは、アニメーション/トランジション(ある場合)が行われたときにdidMoveToParentViewControllerを呼び出す必要があります。私たちがこれらの2つの通知方法を呼び出さなければ何が起こるかはわかりませんが、アップルは言わなければならないと言います。したがって、そうするのが賢明です。

+0

この理由は、VC(View Controller)コンテナを純粋なコンテナとして使用しているため、それに属するビューが存在しないためです。子コンテナ内のビューには、関連するイベントがあります。子VC内のアクション(例えば、完了ボタンを押すこと)は、子VCの解放を決定する。 – Roddy

+0

返信してくれてありがとう、本当に私が読んできたものを明確にするのに役立ちます。 – Roddy

+0

Rob、willMoveToParentViewController:あなたの子ビューコントローラーでそのメソッドをオーバーライドしていない場合は、実際に必要ですか? Appleのドキュメントは、あなたがこれを呼び出すはずのように聞こえるが、あなたの子供の中でそれを上書きしなければ、実際に何かをするかどうかわからない。私はその方法を呼び出さないと何の問題も見ていない。 – rdelmar

関連する問題