当我将视图添加到另一个视图(并且这两个视图都由视图控制器控制)时,我真的应该使用 addChildViewController 吗?

Posted

技术标签:

【中文标题】当我将视图添加到另一个视图(并且这两个视图都由视图控制器控制)时,我真的应该使用 addChildViewController 吗?【英文标题】:Shall I really use addChildViewController when I add a view to another view (and both these views are controlled by view controllers)? 【发布时间】:2015-04-30 17:15:41 【问题描述】:

我正在使用 XIB 构建 UIViewController。在这个 XIB 中,我有占位符(XIB 中的UIView 对象),我在其中放置其他视图,来自其他视图控制器。 (顺便说一下,我也可以直接添加这些视图,不用占位符)

我不是在构建容器视图控制器:我的意思是它不是 UINavigationController。它只是一个“普通”的视图控制器。例如,想象一下,我的视图中有一个小的子视图,用于显示“Facebook”徽标和计数器。这个“facebook 视图”附加到另一个视图控制器,当“Facebook 视图”被触摸时调用。所以,“Facebook 控制器”肯定需要是我的“主”视图控制器的@property

在这种情况下,我真的应该使用addChildViewController: 和所有机制吗?还是没有?

谢谢!

【问题讨论】:

【参考方案1】:

您不应该仅仅使用 UIViewController 来“钓鱼”到 .xib 文件中以获取视图。如果这就是您想要的全部,请不要这样做。只需加载 nib 并直接拉出视图:

NSArray* objects = [[UINib nibWithNibName: @"MyNib" bundle: nil]
            instantiateWithOwner:nil options:nil];
UIView* v = (UIView*)[objects firstObject];

但如果您出于某些其他原因将 UIViewController 与此 .xib 文件结合使用,例如为了让它保持活动状态,以便 .xib 中的按钮可以向这个 UIViewController 发送消息,那么你绝对必须建立正确的父子关系,正如我在我的书中所描述的那样:http://www.apeth.com/iosBook/ch19.html#_container_view_controllers

【讨论】:

我希望我们能解决您上一个问题的这方面问题! 是的,但是想象一下我需要视图还需要SubViewController 的控制器?例如,当用户触摸其中的按钮时,控制器会执行一些操作。在这种情况下,我是否还需要将SubViewController 添加为MainViewController 的子级? 是的。没有其他正确的方法可以让 SubViewController 保持活动状态并将其视图放在 MainViewController 的视图中。正如您所知道的,这就是父子关系,只有一种正确的方法可以做到这一点。 — 我修改了答案以强调这一点。 这对我来说听起来很奇怪......我简直不敢相信!真的。对我来说,亲子关系只适用于UINavigationController等等。比如OSX上就没有这样的父子关系。 嗯,那是因为视图控制器是为 iOS 发明的 - 然后它们被向后读取到 OS X,因此支持并没有以相同的方式完全集成。【参考方案2】:

是的,你应该这样做。通过这样做,包含视图控制器将正确的视图控制器生命周期事件发送到子视图控制器。

你说你不是在构建容器视图控制器,但你是。将另一个视图控制器的视图添加到另一个视图控制器中,就是容器视图控制器的定义。

请参阅UIViewController 文档的“实现容器视图控制器”部分,了解您应该进行的方法调用的正确顺序。这不仅仅是打电话给addChildViewController

【讨论】:

【参考方案3】:

您可以实例化您的内部 ViewController,并将其视图 (myInsiderViewController.view) 添加到您的主视图控制器:

[mainViewController.view addSubView:myInsiderViewController.view];

【讨论】:

所以我不需要另外添加myInsiderViewController 作为mainViewController 的孩子? 不,您不会:您的 myInsiderViewController 将被释放,但是当您将其视图添加到 mainViewController.view 时,它的视图将不会被释放,因为它由 mainController.view 保留(拥有)。 但我需要保留对控制器的(强)引用。我有一个名为myFacebookController 的强参考。除此之外,我是否需要使用父/子机制。这是我的问题(请参阅我的问题的编辑)。 通过将其存储在属性(或对象的 ivar)中来保持强引用(保留),以便以后使用它,但不需要添加 myFacebookController到你的 mainViewController。但是如果你需要在 ViewControllers 上使用父/子机制,那么将其添加为子 ViewController。

以上是关于当我将视图添加到另一个视图(并且这两个视图都由视图控制器控制)时,我真的应该使用 addChildViewController 吗?的主要内容,如果未能解决你的问题,请参考以下文章

从一个 SwiftUI 视图移动到另一个

子视图的位置

尝试使用 segue 将数据从一个视图控制器传递到另一个视图控制器

从一个视图中删除一个视图并将其添加到另一个视图

在列表视图中添加收藏按钮

在导航到另一个视图控制器之前切换标签栏