是否可以将UIViewController的视图添加到另一个UIViewController的视图中?

Kri*_*nan 4 objective-c uiviewcontroller ios

它是明智的一个补充UIViewControllerview另一种UIViewControllerview

请解释为什么这是一个好的做法或一个不好的做法.

小智 6

苹果公司以及大多数遵循Apple指南的人都会告诉你这是不好的做法,因此Apple添加了ViewController包含(childViewControllers).不幸的是,大多数人盲目地遵循这一点,并不会告诉你为什么这是不好的做法.而且我很高兴你这么做.

事实上,在模型 - 视图 - 控制器体系结构中,视图应该是可重用的,无论它们包含什么内容,因此视图和控制视图内容的对象不应该相同.这正是UIViewController在iOS5之前所做的事情Apple不鼓励你多次使用它们,而这是非常合乎逻辑的事情.当然这很令人困惑,许多人忽略了指导方针,无论如何都做了,包括我自己,应用程序工作正常并通过了应用商店验证,这引起了更多的混乱.结果是,直到今天,人们仍然在Apple塌陷并给我们自定义容器ViewControllers一年多后就此问题.一世' 我们已经看到人们经常使用复杂的答案来回答这个问题,只要将UIViewController重新创建为一个继承自NSObject的类来解决非常简单的问题.仅仅因为Apple不鼓励使用UIViewControllers,甚至不知道为什么.

由于将ViewController的视图添加为子视图通常可以很好地工作,并且iOS4中仍然没有ViewController包含,许多人仍然支持,太多人不打扰使用ViewController包含.这是更清洁的解决方案,当您想在ViewControllers中使用ViewControllers时,您应该尽可能使用它.如果没有,在大多数情况下,您应该能够简单地将ViewController的视图添加为子视图,您只需知道在哪些情况下.

如果您只是将ViewController的视图添加到另一个视图,那么您可以期待以下内容:

  • 查看回调方法不能保证被调用.viewWillAppear,viewDidAppear,viewWillDisappear和viewDidDisappear等方法可能会被调用,也可能不会被调用.它在很大程度上取决于操作系统版本,在iOS4中它们永远不会被调用,在iOS5及以上版本中,它们通常会被调用.所以你不能覆盖这些方法,因为你不能依赖它们,你无法控制它们被调用的时间,次数或次数.
  • 始终被正确调用的唯一视图回调方法是viewDidLoad.
  • 旋转回调不会被调用.根据您的情况,这可能是一个大问题或根本不重要.如果视图的autoresizingmask足以重新定位并重新缩放它,那么你就没事了.如果没有,您可以在调用superview的ViewController的旋转回调时始终执行自定义实现.
  • 您必须自己保留对ViewController的引用,否则它将立即释放,而其视图仍将由其superview保留.

我绝对不会鼓励它,但我也不会劝阻它.这是情境化的,如果你不再需要支持iOS4那么你可以避免它.但是,如果你记住上面的列表,那么它也不会造成任何伤害,你的应用程序将正常工作.