iOS的嵌套视图控制器视图位于UIViewController的视图内?


88

在UIViewController的视图中包含嵌套视图控制器的视图,通常在iOS中是不好的编程习惯吗?举例来说,我想使用某种交互式元素来响应用户的触摸,但只占用屏幕的25%。

我想我可以这样说,将这个嵌套的视图控制器添加到我的UIViewController中:

[self.view addSubview: nestedViewController.view];

6
这是一个有很多图片的完整教程! stackoverflow.com/a/23403979/294884 享受
Fattie 2014年

Answers:


145

不,这通常是很好的设计,它有助于保持视图控制器的简洁。但是,您应该使用视图控制器包含模式,请查看以下文档。

实施容器视图控制器

使用Interface Builder和Storyboards进行设置也非常简单,请查看对象库中的Container View。

这是一个情节提要中的人为例子。在此示例中,您将有4个视图控制器,其中一个可容纳3个容器,每个容器一个。当您显示具有所有容器的最左侧控制器时,情节提要将自动初始化并嵌入其他3个容器。您可以通过childViewControllers属性访问这些子视图控制器,也可以使用一种方法覆盖prepareForSegue:sender:并捕获目标容器的目标视图控制器。即将被调用的segue。如果需要,也可以将属性传递给子视图控制器。

在此处输入图片说明


40
您如何在情节提要中做到这一点?!这是一个基本的问题..我不知道:)的答案-回答我自己的问题。将容器添加到场景。塑造它。然后在情节提要的空白字段上创建一个UIViewController。然后,从该容器(在导航器列表或GUI中)右键单击并拖动到该新UIViewController。从弹出窗口中,选择viewDidLoad-embed,以开始使用。谢谢克里斯!:)
Fattie

链接断开了。
约翰·

2
@JoeBlow +1“ viewDidLoad-embed”圣牛:谁会猜到的!
Drux

谢谢@ChrisWagner!这是实现MVVM架构并避免使用Massive View Controller /“ MVC”的难题的关键部分;)
Rob Rob

54

我将此代码放在父视图控制器中。这对我很有效。

对象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

5

这是我基于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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.