【问题标题】:When do you need to use a view controller?什么时候需要使用视图控制器?
【发布时间】:2010-06-13 19:55:42
【问题描述】:

我正在深入研究 iPhone 开发,而我试图了解的核心概念之一是视图控制器。如果您查看苹果开发网站上的 GLPaint 示例,您会看到一个项目...

  1. 应用委托类
  2. 一个 uiwindow 子类
  3. 还有一个 uiview 子类

而 uiview 子类实现了所有核心的图形绘制逻辑并处理触摸事件。我的问题是……

  1. 为什么没有实现视图控制器来处理视图逻辑?
  2. 您可以使用视图控制器来实现该逻辑还是必须在 uiview 子类中实现?
  3. 最后,什么时候应该使用视图控制器来实现视图逻辑代码?

非常感谢您的帮助!

【问题讨论】:

    标签: iphone uiview uiviewcontroller


    【解决方案1】:

    视图知道如何与用户交互。它知道如何显示一些数据,如何处理事件,以及如何向用户提供反馈。

    视图控制器知道什么,但现在知道如何。它知道要显示什么数据,以及响应用户操作要做什么。

    UIButton 知道如何显示标题和图像,以及如何跟踪点击,但不知道标题应该是什么或点击后要做什么。

    UITableView 知道如何在单元格中显示数据以及如何处理编辑,但它不知道要显示什么数据或删除单元格时要做什么。为此,它使用委托和数据源,通常是视图控制器。

    这种区分什么和如何简化了设计和维护。您可以为每种类型的表逻辑创建一个 tableview 的子类,但是您也不能控制其他视图。视图控制器可以控制多个视图并在它们之间进行协调。

    编辑:

    因此,您应该随时使用视图控制器:

    • 多个视图之间的坐标。
    • 模型数据和视图之间的协调。
    • 用视图响应用户交互。
    • 卸载和重新加载视图。

    请注意,视图控制器并不是严格意义上的 UIViewController。您可能有一个视图控制器,它由 UIViewController 拥有并处理一些视图,但派生自 NSObject 或其他。视图控制器管理植根于 UIViewController 的视图层次结构的某些部分,并由该 UIViewController 拥有。 UIViewController 可以反过来成为根植于应用程序委托的层次结构的一部分,并且可能由导航、选项卡或其他元控制器拥有。

    所以应用程序委托拥有零个或多个元控制器,例如 UINavigationController。每个元控制器都拥有一个或多个 UIViewController。它们中的每一个都拥有一个视图层次结构,并且可能拥有几个简单的视图控制器来帮助管理视图层次结构的一部分。如果不需要元控制器,则应用程序委托可以拥有或成为 UIViewController。

    【讨论】:

    • 我假设 BeachRunnerJoe 了解 MVC 设计的基本原理,但实际上想知道为什么一些早期的 iPhone 示例没有专用的根视图控制器,而是使用初始的 AppDelegate 类。这似乎很大程度上是因为基于 Window 和基于 View 的应用程序都存在 Xcode 模板。有时,早期的应用程序示例非常基础,甚至可能会放弃创建 NIB 文件,然后直接以编程方式生成视图。这是我最近在学习 iPhone 开发时注意到并问自己的事情。
    • 我通常使用应用程序委托作为视图控制器层次结构的所有者。它知道首先加载哪个视图控制器,例如,如果恢复保存的状态,并且可以管理全局范围模型对象。至于 Apple 的示例,我假设他们专注于某些事情,而在一个简单的项目中忽略了设计考虑。考虑到即使是一个简单的例子也很重要,Apple 应该始终使用良好的设计模式,但他们在实践他们所宣扬的内容时遇到了困难。
    【解决方案2】:

    如果您需要在视图中找不到的视图控制器中的功能(反之亦然),您会知道该使用哪个。对于您的问题 2,例如,drawRect 回调在 UIView 中可用,但在 UIViewController 中不可用。

    到目前为止,只要涉及到.xib,我都会使用UIViewController

    而且我喜欢在 viewWillAppear viewDidAppear viewWillDisapperviewDidAppear 方法中放入初始化和清理代码(例如 NSTimer)。在处理多个模态弹出窗口和多个视图控制器时,在单入口/出口点的团队中尤其方便。

    【讨论】:

      【解决方案3】:

      视图控制器主要适用于应用程序的全屏部分,您可以在界面构建器中进行布局。每个视图控制器都有一个视图属性,它指向 UIView 或其子类之一,但它们管理的远不止这些。一个视图控制器总是全屏的,所以它可以实现类似 shouldRotateToInterfaceOrientation 的东西:虽然一个屏幕上可能有 5 个 UIView,但只能有一个视图控制器。

      它也是MVC(模型-视图-控制器)的重要组成部分。

      视图控制器连接视图和模型。理论上,模型应该做数学工作,存储数据和其他非 UI 的东西。视图应该绘制和管理。它不应该存储内容,也不应该做任何其他事情,真的。视图控制器将两者连接在一起。它可以从模型中查找数据,并将其提供给视图。这样,更少的代码是特定于应用程序的。您可以重用模型和视图,但大多数时候很难在不修改的情况下重用控制器。

      我不是专家,所以为了澄清,请发表评论。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 2017-06-17
        • 2015-12-02
        相关资源
        最近更新 更多