2013-07-06 142 views
70

在UIViewController的視圖中有一個嵌套的視圖控制器的視圖在iOS中通常是不好的編程習慣嗎?舉例來說,我想要有一些可以響應用戶觸摸的互動元素,但只佔用屏幕的25%。UIViewController視圖中的iOS嵌套視圖控制器視圖?

我想我會說這樣的嵌套視圖控制器添加到我的UIViewController:

[self.view addSubview: nestedViewController.view]; 
+5

這裏有很多圖片的完整教程! http://stackoverflow.com/a/23403979/294884享受 – Fattie

回答

122

不,這總體上是好的設計,它有助於保持你的視圖控制器簡潔。但是,您應該使用視圖控制器遏制模式,請查看以下文檔。

Implementing a Container View Controller

此使用Interface Builder故事板以及是難以置信的簡單設置,您可以在對象庫看看容器視圖。

這是故事板中一個人爲的例子。在這個例子中,你將有4個視圖控制器,一個容納3個容器,每個容器一個。當您顯示具有所有容器的最左側控制器時,故事板將自動初始化並嵌入其他3.您可以通過childViewControllers屬性訪問這些子視圖控制器,或者有一種方法可以覆蓋prepareForSegue:sender:並捕獲目標視圖賽格控制器即將被調用。如果需要的話,也可以將屬性傳遞給子視圖控制器。

enter image description here

+29

「故事」你怎麼做故事板?!這是一個基本的問題..我不知道答案:)嘆 - 回答我自己的問題。將**容器**添加到現場。塑造它。然後在故事板的空白字段中創建一個UIViewController。然後右鍵單擊並從該容器中拖動(在導航器列表或GUI中)到新的UIViewController。從彈出窗口中,選擇viewDidLoad-embed,開始。謝謝克里斯! :)順便說一下, – Fattie

+0

鏈接被打破了。 – Benjohn

+0

謝謝@Benjohn,我更新了鏈接。 –

40

我把這個代碼在父視圖控制器。這對我很有效。

的OBJÇ

-(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)自動顯示: enter image description here

+2

是的! +1。感謝您包括如何以編程方式執行此操作的答案:) – matrixugly

+0

我只是將視圖從子視圖控制器拖放到父級子視圖的列表中。 – dimpiax

5

這是基於我的斯威夫特3溶液上斯威夫特開發商FB的回答

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