何时在iPhone上使用UIView与UIViewController?

我总是想知道什么时候在iPhone上使用UIView和UIViewController。

我知道你不应该使用UIViewController,除非它是全屏视图,但是还有其他的指导方针吗?

例如,我想构build一个模式叠加层 – 一个在当前屏幕上滑动的屏幕。 如果这个模式覆盖是全屏的,它应该是一个UIViewController? 上一次我构build这样的东西,我分类UIViewController,但现在我想知道这是否是正确的。

从苹果的视图控制器编程指南iOS版 :

“视图控制器最重要的作用是pipe理视图的层次结构,每个视图控制器都有一个包含所有视图控制器内容的根视图,在这个视图中添加你需要显示内容的视图。 “

也:

“有两种types的视图控制器:

  • 内容视图控制器pipe理你的应用程序内容的一个离散片段,是您创build的视图控制器的主要types。
  • 容器视图控制器收集来自其他视图控制器(称为子视图控制器)的信息并以便于导航的方式呈现或以不同的方式呈现这些视图控制器的内容。

大多数应用程序是两种types的视图控制器的混合物。“

这是一个很好的问题。

我的基本经验法则。 是应用程序的每个主要“页面”都得到它自己的视图控制器。 我的意思是,在应用程序devise的有线框架阶段,所有以自己的实体存在的东西最终将由其自己的视图控制器来pipe理。 如果有一个模式的屏幕滑过现有的屏幕,我会认为这是一个单独的“页面”,并给它自己的视图控制器。 如果有一个视图,覆盖和现有的页面(如加载屏幕或帮助popup。)我会对待这些不同的,实现它们作为UIView子类,并保持在'页面'视图控制器的逻辑。 popup窗口具有行为,我将使用委托模式将信息反馈给该页面的View Controller。

我希望这有帮助。 这是一个非常哲学和build筑的问题,可以写很多。

每当一个视图是全屏幕,并且有sockets/动作和/或子视图时,我使用UIViewController。

我有一个不同的方法:

如果您打算在drawRect中执行自定义绘图,请覆盖UIView。 否则,使用子类UIViewController并使用[self.view addSubview:blah]来添加页面的组件。

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

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

是在一个自足的屏幕上滑动的东西? 我的意思是,它是否直接与父母互动? 如果是这样,使其成为一个UIView ,如果不是,可能会推荐一个UIViewController

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

你给的例子在大多数情况下是正确的。 正如你可能已经注意到,当inheritanceUIViewController的时候你会得到很多的function。 animation的UIViewController的出现和解雇将是其中之一。

正如marcc指出,如果你想滑入的东西不是一个自包含的屏幕,你最好使用UIView。

作为一个结论,我会说,如果你想使用UIViewController的子类的function比它使它成为一个UIViewController。 否则UIView可能会更好。

itunes U Standford类在UIViewControllers上有一个很好的演讲,我build议你看一下,因为它有很多关于UIViewControllers的信息。

如果您熟悉MVC模式,那么您应该能够理解UIVIew和UIViewController之间的区别。 为了做一个简单的声明,UIView用于在屏幕上呈现UI元素。 UIView是几乎所有Cocoa Touch UI元素的超类。 这些元素不知道他们应该显示什么信息,当用户点击button时他们应该做什么,当asynchronousnetworking请求完成时会发生什么,等等。 UIViewController是所有的和更多。 视图控制器负责将UI元素放置在屏幕上的正确位置,设置UI元素的内容,处理button和其他用户input,在需要时更新模型等。

从概念上讲,单个UIViewController控制iPhone应用程序中整个屏幕的内容,这就是为什么在视图控制器方面往往容易想到事物。 如果你需要一个视图,用户可以select一个食谱食材,你需要一个UIViewController。 我为自己做了这个区别,因为来自Java背景,我不习惯于强制MVC的框架。 我想用UIViews的方式来思考问题,并开始以这种方式实现,然后因此而遇到各种各样的麻烦。 如果您要为您的应用程序坚持使用UIKit,那么Apple为您制作的工作stream程是:对于应用程序中的每个单独的视图,创build一个UIViewController子类,然后使用Interface Builder来放置UI元素并为button创build连接它创造奇迹,节省了大量的时间,让你专注于使您的应用程序function良好。

把屏幕上的所有内容放到UIViewController中,直到视图控制器开始有太多的代码,然后将屏幕分解成一个主视图控制器所包含的多个UIViewController。

把它放到你的答案的上下文中,为这个模态叠加做一个视图控制器。 无论如何,如果您使用导航控制器来呈现它(您可能应该)。