web-dev-qa-db-ja.com

UIView Controllerのビュー内のiOS Nested View Controllersビュー?

UIViewControllerのビュー内にネストされたView Controllerのビューを配置することは、iOSでの一般的な悪いプログラミングプラクティスですか?たとえば、ユーザーのタッチに応答する何らかの種類のインタラクティブな要素が必要だったとしますが、画面の25%しか占めません。

次のように言って、このネストされたView ControllerをUIViewControllerに追加すると思います。

[self.view addSubview: nestedViewController.view];
85
Skyler

いいえ、これは一般的に優れた設計であり、View Controllerを簡潔に保つのに役立ちます。ただし、View Controllerの格納パターンを使用する必要があります。次のドキュメントを参照してください。

Container View Controllerの実装

これは、ストーリーボードとともにInterface Builderを使用してセットアップするのも非常に簡単です。オブジェクトライブラリのコンテナビューを見てください。

これがストーリーボードの不自然な例です。この例では、4つのView Controllerがあり、1つは3つのコンテナを保持し、もう1つは各コンテナに対応しています。すべてのコンテナを持つ左端のコントローラーを提示すると、Storyboardは自動的に他の3を初期化して埋め込みます。これらの子Viewコントローラーには、childViewControllersプロパティを介してアクセスするか、prepareForSegue:sender:および呼び出されようとしているセグエの宛先View Controllerをキャプチャします。これは、必要に応じて子View Controllerにプロパティを渡すのにも適しています。

enter image description here

138
Chris Wagner

このコードを親View Controllerに配置しました。それは私にとって素晴らしいことです。

Obj C

-(void)viewDidLoad{
     [super viewDidLoad];
     InnerViewController *innerViewController = [self.storyboard instantiateViewControllerWithIdentifier:INNER_VIEW_CONTROLLER];
     [self addChildViewController:innerViewController];
     [self.view addSubview:innerViewController.view];
     [innerViewController didMoveToParentViewController:self];
}

Swift

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)

もう1つのオプションは、IBを使用してコンテナビューを配置することです。 UIViewControllerが自動的に表示されます(この場合はXCode 9): enter image description here

52

Swift Developers On FBの回答に基づくSwift 3ソリューション

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
5
Rajat Jain