请清除一些关于UIViewController的混淆

请清除一些关于UIViewController混淆

我发现这篇文章Abusing UIViewController ,这里是链接link1 & link2

并总结了几点

这是作者(和苹果)的build议简而言之:

  1. 一个(也是唯一的)视图控制器应该负责UIViews的整个层次(或屏幕)。
  2. 大多数情况下,你只能在每个屏幕上使用一个视图控制器。 本质上,当前UIWindowrootViewController应该是唯一具有可见视图的UIViewController
  3. 每个不同的屏幕应该有一个不同的视图控制器,即一个控制器不应该控制多个屏幕。
  4. 您不应该在视图层次结构中嵌套自定义的UIViewControllers
  5. 如果多个UIViewController挂起应用程序的UIWindow ,则只有其中一个将获取方向更改的消息。 其他(S)不会得到这些消息。
  6. 嵌套的UIViewControllers无法保证(或者可能)接收到方向或生命周期消息(如viewDidAppear:viewWillAppear:viewDidDisappear:viewWillDisappear:更改消息viewWillDisappear:即使它们从UIViewControllerinheritance。 只有最上面的UIViewController肯定会得到这些消息。

请清除2号和3号点,因为当我们使用UINavigationControllerUITabBarController我们使用UIViewController多个子类。 而iOS设备只有一个屏幕…..

本文滥用UIViewController突出显示苹果的build议

注意:如果要将视图层次划分为多个子区域,并分别pipe理每个子区域,请使用通用控制器对象(从NSObject降序的自定义对象)而不是视图控制器对象来pipe理每个子区域。 然后使用单个视图控制器对象来pipe理通用控制器对象。

并在苹果文档下的Coordinating Efforts Between View ControllersCoordinating Efforts Between View Controllers苹果说

很less有iOS应用程序只显示一个屏幕内容。 相反,它们会在首次启动时显示一些内容,然后显示和隐藏其他内容以响应用户操作。 这些转换提供了一个单一的统一的用户界面,显示大量的内容,只是不是一次…..

我的要求是使用任何容器或模式或popover,我想做手动pipe理,我有两个视图控制器VC1VC2VC1是现在我想要切换/传输/移动到VC2的根视图控制器,我应该怎么做?

  1. VC1应该是UIViewController的唯一子类,而VC2应该是NSObject的子类来pipe理VC1层次结构中的特定视图?(由apple doc显示隐藏的东西)。

  2. VC2也可以是UIViewController的子类,我只是从根视图中删除VC1 ,并添加VC2作为根视图?

或者什么是正确的方法?

容器视图控制器(如UINavigationController)允许解决一个VC每个屏幕规则。 从iOS 5开始,开发人员就可以编写我们自己的容器控制器(与普通的VC没什么区别)。 通常这意味着编写非VC控制器对象不像以前那么必要。

在你想要replace根视图控制器的情况下,你的选项2更有意义。 尽可能使用VC,而不使用VC控制器的对象。 由于您要replace整个屏幕的内容,因此只需切换UIWindow rootViewController是最有意义的(编辑:或者,许多开发人员只是使用导航控制器来呈现第二个视图,因为它简单方便)。