将 UIViewControllers 放在其他 UIViewControllers 中是不好的做法吗?

Posted

技术标签:

【中文标题】将 UIViewControllers 放在其他 UIViewControllers 中是不好的做法吗?【英文标题】:Is it bad practice to put UIViewControllers in other UIViewControllers? 【发布时间】:2015-05-13 15:45:44 【问题描述】:

我知道 ios 开发中的常见做法是在屏幕上显示一个 UIViewController,其视图是从 XIB 加载的,其中包含所有 UIView 子类。

当我在为应用程序开发一个非常复杂的小部件时,我决定将小部件作为 UIViewController 的子类而不是 UIView。这是因为我认为 UIViewController 本质上是一个带有一些辅助方法的 UIView。然后我可以为它创建一个 XIB(我知道 UIView 也可以有自己的 XIB),加载它包含的视图,将 ITS 视图放置在呈现的父 VC 的视图中,然后进行布局。

到目前为止,这工作得很好,但我想知道这是否是不好的做法,我是否应该只继承一个 UIView 并给它一个普通的 NSObject 控制器。我看到了一些问题,我想知道是否有人可以解决我对这种方法的担忧?

编辑注意:小部件 VC 与它所在的 VC 视图无关,可在任何屏幕上重复使用。所以答案不是用父 VC 子类化小部件 VC。小部件位于父 VC 内部,但它不是父 VC。

编辑注 2:我没有使用 Storyboard。只有自动布局、XIB 和 ARC。

为什么我们不能在 VC 中拥有 VC?

1) 能否将 VC 简单地放入 ANOTHER VC 的 XIB 并作为子视图轻松加载?

2) 我在这里读到:When to use a UIView vs. a UIViewController on the iPhone?

上面的答案解释了 VC 如何控制屏幕的旋转和重新布置子视图,所以如果你添加另一个 VC,那么系统会自动认为那是主 VC,并会尝试旋转它,导致问题。这是真的?或者他只是在谈论你是否以某种方式进入了“展示”了 2 个 VC 的状态?我不确定他的回答是否适用于其他 VC 视图的 SUBVIEWS 的 VC 视图。

3) 一般来说,这是一种好的做法吗?这当然看起来更合理,因为它使加载子视图 VC 的视图更加容易。

谢谢!

【问题讨论】:

【参考方案1】:

绝对没问题。您的问题的答案是ContainerView

Container View 在视图控制器的视图子图中定义了一个区域,该区域可以包含子视图控制器。在故事板中创建从容器视图到子视图控制器的嵌入转场。

【讨论】:

ContainerView 似乎不在故事板中。他们是否需要在 ContainerView 中,或者我们可以手动将子 VC 的视图设置为子视图并将子 VC 分配为父 VC 的子级,仅此而已? 是的,Apple 也这样做了。你可以阅读这篇文章,内容比较全面developer.apple.com/library/ios/featuredarticles/…【参考方案2】:

你几乎猜对了。是的,为你需要的东西制作一个视图控制器是件好事。但是您不应该只是将它的视图添加到父视图中,还应该将视图控制器添加为第一个视图的子视图控制器。 您可以添加许多视图控制器作为视图控制器的子视图控制器。

您可以通过here了解更多信息。

【讨论】:

@lespommes 他不是在建议子类化。您可以将视图控制器添加到任意数量的其他 vc 中,而不考虑类,作为子 vc。同样,您也可以将任意数量的子 vc 添加到 vc 中。由于您不使用情节提要,因此您也可以以编程方式执行此操作。 完全误读了该答案。哎呀。不知道我如何阅读子类而不是孩子。谢谢!评论已删除。

以上是关于将 UIViewControllers 放在其他 UIViewControllers 中是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

UIViewControllers 中的 UIViewController

如何添加和删除 UIViewControllers 到其他 UIViewControllers

内存泄漏,多个 UIViewControllers 的其他问题

UIScrollView 中的 UIViewControllers?

在其他视图控制器下面创建一个视图控制器

跨多个UIViewControllers的统一UICollectionView