UIViewControllerのビュー内にネストされたView Controllerのビューを配置することは、iOSでの一般的な悪いプログラミングプラクティスですか?たとえば、ユーザーのタッチに応答する何らかの種類のインタラクティブな要素が必要だったとしますが、画面の25%しか占めません。
次のように言って、このネストされたView ControllerをUIViewControllerに追加すると思います。
[self.view addSubview: nestedViewController.view];
いいえ、これは一般的に優れた設計であり、View Controllerを簡潔に保つのに役立ちます。ただし、View Controllerの格納パターンを使用する必要があります。次のドキュメントを参照してください。
これは、ストーリーボードとともにInterface Builderを使用してセットアップするのも非常に簡単です。オブジェクトライブラリのコンテナビューを見てください。
これがストーリーボードの不自然な例です。この例では、4つのView Controllerがあり、1つは3つのコンテナを保持し、もう1つは各コンテナに対応しています。すべてのコンテナを持つ左端のコントローラーを提示すると、Storyboardは自動的に他の3を初期化して埋め込みます。これらの子Viewコントローラーには、childViewControllers
プロパティを介してアクセスするか、prepareForSegue:sender:
および呼び出されようとしているセグエの宛先View Controllerをキャプチャします。これは、必要に応じて子View Controllerにプロパティを渡すのにも適しています。
このコードを親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):
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)