私は、iOSの開発に初めて足を浸すことだ、と私はやって持っていた最初のものの一つが実装され、カスタムコンテナビューコントローラを -それを呼び出すことができますSideBarViewController
-スワップそれいくつかの可能な子ビューコントローラのどの出ていることは、標準のTab Bar Controllerとほぼ同じです。(これはほとんどタブバーコントローラーですが、タブバーの代わりに非表示のサイドメニューがあります。)
Appleのドキュメントの指示に従ってaddChildViewController
、子ViewControllerをコンテナに追加するたびに呼び出します。表示されている現在の子ビューコントローラーを交換するための私のコードは、SideBarViewController
次のようになります。
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
それから私addChildViewController
はここで何をしているのかを理解しようとし始めました、そして私は自分が何も知らないことに気付きました。アレイに新しいものViewController
を貼り付ける以外に.childViewControllers
、何にも影響がないようです。子コントローラーのビューからストーリーボードに設定した子コントローラーへのアクションとアウトレットは、を呼び出さなくても正常に機能しaddChildViewController
、他に何が影響するか想像できません。
実際、を呼び出さないようにコードを書き直した場合addChildViewController
、代わりに次のようになります...
- (void)showViewController:(UIViewController *)newViewController {
// Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];
currentChildViewController = newViewController;
}
...それでも私のアプリは完璧に機能します。
Appleのドキュメントは何をするのかaddChildViewController
、なぜ私たちがそれを呼ばなければならないのかについて多くのことを明らかにしていません。現在、メソッドの機能またはUIViewController
クラスリファレンスのセクションでメソッドを使用する理由の関連する説明の全体は、次のとおりです。
指定されたビューコントローラを子として追加します。...このメソッドは、カスタムコンテナビューコントローラの実装によって呼び出されることのみを目的としています。このメソッドをオーバーライドする場合は、実装でsuperを呼び出す必要があります。
同じページの前半にもこの段落があります。
コンテナビューコントローラは、子のルートビューをビュー階層に追加する前に、子ビューコントローラをそれ自体に関連付ける必要があります。これにより、iOSはイベントを子ビューコントローラーとそれらのコントローラーが管理するビューに適切にルーティングできます。同様に、子のルートビューをビュー階層から削除した後、子ビューコントローラをそれ自体から切断する必要があります。これらの関連付けを作成または解除するために、コンテナは基本クラスで定義された特定のメソッドを呼び出します。これらのメソッドは、コンテナークラスのクライアントによって呼び出されることを意図していません。これらは、コンテナーの実装でのみ使用され、期待される封じ込め動作を提供します。
呼び出す必要のある可能性のある基本的なメソッドは次のとおりです。
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
しかし、それはそれが話している「イベント」または「予想される封じ込め動作」が何であるか、またはこれらのメソッドの呼び出しが「必須」である理由(または場合でも)についての手掛かりを提供しません。
Appleドキュメントの「カスタムコンテナービューコントローラー」セクションにあるカスタムコンテナービューコントローラーの例では、すべてこのメソッドを呼び出しているため、子ViewControllerを配列にポップするだけでなく、いくつかの重要な目的に役立つと思いますが、わかりません。その目的は何ですか。このメソッドは何をするのですか、なぜそれを呼び出す必要があるのですか?