iOS嵌套视图控制器:将视图放在UIViewController的视图中?

97

在iOS中,将嵌套视图控制器的视图放置在UIViewController的视图中是否是通常不良的编程实践?比如说,我想要添加一种交互元素以响应用户的触摸事件,但是只占屏幕的25%。

我想我会通过以下方式将此嵌套视图控制器添加到我的UIViewController中:

[self.view addSubview: nestedViewController.view];

6
这是一篇有很多图片的完整教程!!https://dev59.com/KGAg5IYBdhLWcg3wm7_6#23403979 享受吧! - Fattie
3个回答

152
不,这通常是很好的设计,它有助于使您的视图控制器简洁。但是,您应该使用视图控制器容器模式,请查看以下文档。 实现容器视图控制器 使用故事板与Interface Builder设置这个非常简单,可以查看对象库中的容器视图。
这里是一个虚构的故事板示例。在这个例子中,您将有4个视图控制器,一个用于容纳3个容器,每个容器一个。当您呈现最左边的控制器,即拥有所有容器的控制器时,Storyboard会自动初始化并嵌入其余的3个控制器。您可以通过`childViewControllers`属性访问这些子视图控制器,或者有一个方法可以重写`prepareForSegue:sender:`并捕获要调用的segue的目标视图控制器。这也是向子视图控制器传递必要属性的好时机。 enter image description here

44
在Storyboard中怎么做这个?这是一个基本问题,我不知道答案 :) 哎 -- 回答自己的问题。在场景中添加一个容器并将其形状调整好。然后在Storyboard的空白区域上创建一个UIViewController。接着从该容器(无论是Navigator列表还是GUI中的)向新建的UIViewController右键拖动。从弹出窗口中选择viewDidLoad-embed以开始使用。谢谢Chris! :) - Fattie
链接已经失效了,顺便提一下。 - Benjohn
2
@JoeBlow +1 "viewDidLoad-embed" 哇塞:谁会想到这个! - Drux
感谢@ChrisWagner!这是实现MVVM架构并避免巨大视图控制器/"MVC"的关键部分。 - Rob

58

我把这段代码放在父视图控制器中。它对我很有效。

Objective-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:


Swift是一种面向对象的编程语言,由苹果公司开发。它于2014年首次亮相,并逐渐成为iOS和macOS应用程序开发的首选语言。 Swift易学易用,同时也运行速度快。
 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):输入图像描述


3
是的!+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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接