【问题标题】:Please clear some confusions regarding UIViewController请清除关于 UIViewController 的一些困惑
【发布时间】:2013-07-15 15:17:11
【问题描述】:

请澄清一些关于UIViewController的困惑

我找到了这篇文章Abusing UIViewController,这里是链接link1 & link2

及总结要点

这是作者(和 Apple)的建议 简而言之:

  1. 一个(并且只有一个)视图控制器应该负责整个 UIView 层次结构(或全屏)。
  2. 大多数情况下,每个屏幕只应使用一个视图控制器。本质上,当前UIWindow 中的rootViewController 应该是唯一具有可见视图的UIViewController
  3. 每个不同的屏幕都应该有一个不同的视图控制器,即一个控制器不能控制多个屏幕。
  4. 您不应在视图层次结构中嵌套自定义 UIViewControllers
  5. 如果有多个UIViewController 挂在应用程序的UIWindow 上,则只有其中一个会收到有关方向更改的消息。其他人不会收到这些消息。
  6. 嵌套的UIViewControllers 不能保证或可能接收有关方向变化的消息或生命周期消息,例如viewDidAppear:viewWillAppear:viewDidDisappear:viewWillDisappear:,即使它们继承自UIViewController。只有最上面的UIViewController 肯定会收到这些消息。

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

本文Abusing UIViewController高亮苹果建议

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

apple docs标题下Coordinating Efforts Between View Controllers苹果说

很少有 iOS 应用只显示一屏内容。相反,他们 首次启动时显示一些内容,然后显示和隐藏其他内容 响应用户操作的内容。这些转变提供了一个 显示大量内容的单一统一用户界面,只是没有 一下子......

我的要求是使用任何容器或模态或弹出框,我想做手动管理,我有两个视图控制器VC1VC2VC1 是根视图控制器现在我想切换/中转/移动到VC2 我该怎么办?

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

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

或者正确的方法是什么?

【问题讨论】:

  • @rmaddy 请回复。
  • 这些是开发应用程序架构时必须弄清楚的重要一般问题。你可以写一本关于这些基本主题的整本书。不要忘记,随着时间的推移,Apple 会利用 SDK,而昨天的答案并不总是能解决今天或明天的问题。我在一种情况下开发自己的容器视图控制器,当我不仅想在容器中使用子视图控制器,而且还想在没有父容器视图控制器的情况下将其用作功能齐全的视图控制器。

标签: ios uiviewcontroller


【解决方案1】:

容器视图控制器(如 UINavigationController)允许解决每个屏幕一个 VC 的规则。自 iOS 5 以来,开发人员已经能够并允许编写我们自己的容器控制器(实际上与普通 VC 并没有太大区别)。一般来说,这意味着编写非 VC 控制器对象的必要性比以前少了。

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

【讨论】:

  • 感谢您的回复,对不起,我没有明白这一点“容器视图控制器(如 UINavigationController)允许解决每屏幕一个 VC 的规则”,但 idevices 只有一个屏幕。出于学习目的,请考虑只有 ios4 可用,我们没有自定义容器,或者在 ios5 之前它是如何完成的?
  • 在 iOS5 之前,您拥有三个 Apple 提供的容器 VC:导航控制器、选项卡控制器和(仅在 iPad 上)拆分视图控制器。如果您需要为屏幕视图提供多个控制器,并且您想要显示它们的方法不符合提供的容器 VC 的模式,那么您需要小心为所有控制器编写非 VC 控制器类而是可见部分之一。
  • 我不想在屏幕上一次显示任何多个视图控制器,我完全想使用模态、弹出框或容器。
猜你喜欢
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 2016-09-15
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多