在iPhone上何时使用UIView与UIViewController?

在iPhone上何时使用UIView与UIViewController?,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我一直想知道什么时候在iPhone上使用UIView和UIViewController 我知道除非是全屏视图,否则不应该使用UIViewController,但还有什么其他指导原则 例如,我想构建一个模式覆盖-一个可以在当前屏幕上滑动到位的屏幕。如果此模式覆盖是全屏的,它应该是UIViewController吗?上次我构建这样的东西时,我将UIViewController子类化,但现在我想知道这是否正确。是在自包含屏幕中滑动的东西吗?我的意思是,它是否直接与父母互动?如果是,请将其设置为UIVi

我一直想知道什么时候在iPhone上使用UIView和UIViewController

我知道除非是全屏视图,否则不应该使用UIViewController,但还有什么其他指导原则


例如,我想构建一个模式覆盖-一个可以在当前屏幕上滑动到位的屏幕。如果此模式覆盖是全屏的,它应该是UIViewController吗?上次我构建这样的东西时,我将UIViewController子类化,但现在我想知道这是否正确。

是在自包含屏幕中滑动的东西吗?我的意思是,它是否直接与父母互动?如果是,请将其设置为
UIView
,如果不是,可能建议使用
UIViewController

这是一个很好的问题

我的基本经验法则。应用程序的每个主要“页面”都有自己的视图控制器。我的意思是,在应用程序设计的线框阶段,作为自己的实体存在的所有东西最终都将由自己的视图控制器管理。如果有一个在现有屏幕上滑动的模式屏幕,我会认为它是一个单独的“页面”,并给它自己的视图控制器。如果有一个视图覆盖了现有页面(如加载屏幕或帮助弹出窗口),我会区别对待它们,将它们实现为UIView子类,并将逻辑保留在“页面”视图控制器中。如果弹出窗口有行为,我将使用委托模式与该页面视图控制器通信


我希望这有帮助。这在很大程度上是一个哲学和体系结构问题,可以写很多东西。

每当一个视图是全屏的,或者有出口/动作和/或子视图时,我都会使用UIViewController。

UIView是UIViewController的一部分,请参见UIViewController的view属性。正如您正确指出的,UIViewController管理一个完整的屏幕,一次应该只有一个可见的UIViewController。但在大多数情况下,屏幕上会显示更多的UIView或UIView的子类

你给出的例子在大多数情况下都是正确的。您可能已经注意到,在对UIViewController进行子类化时,您将获得很多功能。为UIViewController的外观设置动画并将其删除就是其中之一

正如marcc所指出的,如果您想要滑入的不是一个独立的屏幕,那么最好使用UIView

作为结论,我想说的是,如果您想使用子类化UIViewController所附带的功能,那么就让它成为UIViewController。否则,UIView可能会更好


itunes U Standford课程有一个关于UIViewController的精彩讲座,我建议大家观看,因为它包含了很多关于UIViewController的信息。

将屏幕上的所有内容都放到UIViewController中,直到view controller开始有太多代码,然后将屏幕拆分为一个主视图控制器包含的多个UIViewController

若要将其置于答案的上下文中,请为该模式覆盖创建一个视图控制器。如果您使用导航控制器来显示它,它无论如何都会有一个(您可能应该这样做)。

来自苹果:

视图控制器最重要的作用是管理视图的层次结构。每个视图控制器都有一个包含视图控制器所有内容的根视图。您可以将显示内容所需的视图添加到该根视图中

此外:

“有两种类型的视图控制器:

  • 内容视图控制器管理应用程序内容的一部分,是您创建的视图控制器的主要类型
  • 容器视图控制器从其他视图控制器(称为子视图控制器)收集信息,并以便于导航或以不同方式显示这些视图控制器的内容的方式进行显示

大多数应用程序都是这两种视图控制器的混合体。”

我有一种不同的方法:

如果计划在drawRect中进行自定义绘图,请替代UIView。否则,子类UIViewController并使用[self.view addSubview:blah]添加页面的组件

还有一些其他特殊情况,但这可以处理大约95%的情况


(您仍然经常需要一个带有自定义UIView的UIViewController。但是,有一个没有相应自定义UIView的自定义UIViewController是很常见的。)

如果您熟悉MVC模式,那么您应该能够理解UIView和UIViewController之间的区别。简单来说,UIView用于在屏幕上呈现UI元素。UIView是几乎所有Cocoa Touch UI元素的超类。这些元素不知道应该显示什么信息,用户单击按钮时应该做什么,异步网络请求完成时会发生什么,等等。UIViewController适用于所有这些以及更多。视图控制器负责将UI元素放置在屏幕上的正确位置,设置UI元素的内容,处理按钮按下和其他用户输入,在需要时更新模型等

从概念上讲,单个UIViewController控制iPhone应用程序中整个屏幕的内容,这就是为什么通常很容易从视图控制器的角度来考虑问题。如果您需要一个视图,用户可以在其中为食品配方选择配料,则需要一个UIViewController。我之所以做出这种区分,是因为我来自Java背景,不习惯于实施MVC的框架。我会从UIView的角度考虑问题,并开始以这种方式实现它们,然后因为它而遇到各种各样的麻烦。如果你打算坚持应用UIKit,那么苹果为你制定的工作流程是:针对每个单独的应用程序