UIViewControllerのビュー内のiOSネストビューコントローラービュー?


88

UIViewControllerのビュー内にネストされたビューコントローラーのビューを含めることは、iOSでのプログラミングの習慣として一般的に不適切ですか?たとえば、ユーザーのタッチに反応するが、画面の25%しか占めないようなインタラクティブな要素が欲しいとしましょう。

次のように言って、このネストされたビューコントローラをUIViewControllerに追加するとします。

[self.view addSubview: nestedViewController.view];

6
たくさんの写真を載せた完全なチュートリアルです! stackoverflow.com/a/23403979/294884 楽しむ
Fattie

回答:


145

いいえ、これは一般的に優れた設計です。ビューコントローラを簡潔に保つのに役立ちます。ただし、ビューコントローラーの包含パターンを使用する必要がある場合は、次のドキュメントをご覧ください。

Container View Controllerの実装

これは、ストーリーボードを備えたインターフェイスビルダーを使用して設定するのも非常に簡単です。オブジェクトライブラリのコンテナービューをご覧ください。

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

ここに画像の説明を入力してください


40
ストーリーボードでどのように「地獄」を行うのですか?それは基本的な質問です..への答えはわかりません:)ため息-私自身の質問に答えます。コンテナをシーンに追加します。それを形作ります。次に、ストーリーボードの空白のフィールドにUIViewControllerを作成します。次に、そのコンテナー(ナビゲーターリストまたはGUIのいずれか)から右クリックして、新しいUIViewControllerにドラッグします。ポップアップから、viewDidLoad-embedを選択して開始します。クリス、ありがとう!:)
Fattie

ちなみにリンク切れです。
ベンジョン

2
@JoeBlow +1 "viewDidLoad-embed"聖牛:誰がそれを推測したでしょう!
Drux、2015年

@ChrisWagner、ありがとう!これは、MVVMアーキテクチャを実装し、Massive View Controller / "MVC"を回避するためのパズルの重要な部分です。)
Rob

54

このコードを親のビューコントローラーに配置しました。それは私にとって素晴らしい働きをします。

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): ここに画像の説明を入力してください


2
はい!+1。プログラムでこれを行う方法の回答を含めてくれてありがとう:)
C. Tewalt

子ビューコントローラーから親サブビューのリストにビューをドラッグアンドドロップするだけです。
dimpiax 2017

5

これは、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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.