UIViewControllerのビュー内にネストされたビューコントローラーのビューを含めることは、iOSでのプログラミングの習慣として一般的に不適切ですか?たとえば、ユーザーのタッチに反応するが、画面の25%しか占めないようなインタラクティブな要素が欲しいとしましょう。
次のように言って、このネストされたビューコントローラをUIViewControllerに追加するとします。
[self.view addSubview: nestedViewController.view];
UIViewControllerのビュー内にネストされたビューコントローラーのビューを含めることは、iOSでのプログラミングの習慣として一般的に不適切ですか?たとえば、ユーザーのタッチに反応するが、画面の25%しか占めないようなインタラクティブな要素が欲しいとしましょう。
次のように言って、このネストされたビューコントローラをUIViewControllerに追加するとします。
[self.view addSubview: nestedViewController.view];
回答:
いいえ、これは一般的に優れた設計です。ビューコントローラを簡潔に保つのに役立ちます。ただし、ビューコントローラーの包含パターンを使用する必要がある場合は、次のドキュメントをご覧ください。
これは、ストーリーボードを備えたインターフェイスビルダーを使用して設定するのも非常に簡単です。オブジェクトライブラリのコンテナービューをご覧ください。
これは、ストーリーボードの不自然な例です。この例では、4つのビューコントローラーがあり、1つは3つのコンテナーを保持し、もう1つはコンテナーごとに保持します。すべてのコンテナーを含む左端のコントローラーを提示すると、ストーリーボードは自動的に他の3を初期化して埋め込みます。childViewControllers
プロパティを介してこれらの子ビューコントローラーにアクセスするかprepareForSegue:sender:
、宛先のビューコントローラーをオーバーライドしてキャプチャできるメソッドがあります。呼び出されようとしているセグエ。これは、必要に応じて子ビューコントローラにプロパティを渡すのにも良い点です。
このコードを親のビューコントローラーに配置しました。それは私にとって素晴らしい働きをします。
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];
}
スウィフト:
let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
self.addChildViewController(childViewController)
self.view.addSubview(childViewController.view)
childViewController.didMove(toParentViewController: self)
別のオプションは、IBを使用してコンテナービューを配置することです。UIViewControllerが自動的に表示されます(この場合はXCode 9):
これは、FBの回答に基づいたSwift Developersに基づく私のSwift 3ソリューションです
let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
self.addChildViewController(childViewController)
self.view.addSubview(childViewController.view)
childViewController.didMove(toParentViewController: self)