我一直在疑惑在iPhone上何时使用UIView和UIViewController。
我知道除非是全屏视图,否则不应该使用UIViewController,但还有哪些指导方针呢?
例如,我想构建一个模态覆盖层 - 一个会滑动到当前屏幕上的屏幕。 如果这个模态覆盖层是全屏的,是否应该使用UIViewController呢?上次我构建类似的东西时,我子类化了UIViewController,但现在我想知道那是否正确。
我一直在疑惑在iPhone上何时使用UIView和UIViewController。
我知道除非是全屏视图,否则不应该使用UIViewController,但还有哪些指导方针呢?
例如,我想构建一个模态覆盖层 - 一个会滑动到当前屏幕上的屏幕。 如果这个模态覆盖层是全屏的,是否应该使用UIViewController呢?上次我构建类似的东西时,我子类化了UIViewController,但现在我想知道那是否正确。
来自苹果的iOS视图控制器编程指南:
"视图控制器最重要的作用是管理视图层次结构。每个视图控制器都有一个单一的根视图,它包含了所有视图控制器的内容。在该根视图中,您可以添加需要显示内容的视图。"
此外:
"有两种类型的视图控制器:
大多数应用程序都是两种类型的视图控制器的混合体。
这是一个很好的问题。
我的基本经验法则是,每个应用程序的主要“页面”都会有自己的视图控制器。这意味着在应用程序设计的线框阶段,一切作为独立实体存在的内容最终将由其自己的 View Controller 管理。 如果有一个模态屏幕滑过现有屏幕,我会考虑将其视为单独的“页面”,并为其分配自己的视图控制器。如果有一个覆盖现有页面的视图(例如加载屏幕或帮助弹出窗口),我会对它们进行不同的处理,将它们实现为 UIView 子类,并将逻辑保留在该“页面”的视图控制器中。如果弹出窗口具有行为,则将使用委托模式向那些页面的 View Controller 进行通信。
希望这有所帮助。这是非常哲学和架构问题,还有很多可以写的内容。
每当一个视图是全屏的,并且具有出口/操作和/或子视图时,我使用UIViewController。
我有一种稍微不同的方法:
如果您计划在drawRect中进行自定义绘制,请覆盖UIView。否则,子类化UIViewController并使用[self.view addSubview:blah]添加页面组件。
还有一些其他特殊情况,但这处理了大约95%的情况。
(您仍然经常需要具有自定义UIView的UIViewController。但通常会有一个没有相应自定义UIView的自定义UIViewController。)
UIView
,否则,建议使用UIViewController
。UIView是UIViewController的一部分,请参阅UIViewController的view属性。正如你正确指出的,UIViewController管理一个完整的屏幕,一次只能有一个可见的UIViewController。但在大多数情况下,您会在屏幕上看到更多的UIView或其子类。
你给出的例子在大多数情况下是正确的使用方式。正如你可能已经注意到的,当子类化UIViewController时,您将获得很多功能。其中之一就是对UIViewController的出现和消失进行动画处理。
正如marcc指出的,如果您要滑入的东西不是一个独立的屏幕,最好使用UIView。
总结一下,如果您想要使用子类化UIViewController带来的功能,那就选择它,将其设置为UIViewController。否则,UIView可能更合适。
iTunes U Standford课程有一堂关于UIViewControllers的精彩讲座,我推荐观看,因为它包含了关于UIViewControllers的许多信息。
我使用UIViewController来显示全屏视图。
为了更好地控制自定义视图,我更喜欢使用UIViewController的子类而不是UIView,之前我使用UIView来创建自定义子类。