【问题标题】:Should view logic go in a UIView or (when applicable) its UIViewController?视图逻辑应该放在 UIView 中还是(如果适用)它的 UIViewController 中?
【发布时间】:2011-04-10 22:08:55
【问题描述】:

我最近发现UIViews 在填满整个窗口时应该只有UIViewControllers(或者由另一个UIViewController 管理,例如UINavigationControllerUISplitViewController)。此引用来自UIViewController 的文档:

您不应使用视图控制器来管理仅填充其窗口的一部分的视图,即仅填充由应用程序内容矩形定义的区域的一部分。如果您想拥有一个由多个较小视图组成的界面,请将它们全部嵌入到一个根视图中,并使用您的视图控制器管理该视图。

我通常将视图逻辑放在 UIView 中,即使它由 UIViewController 管理,但我经常发现自己需要访问 UIViewController 的属性,例如它的 navigationController 属性。但是,UIView 不应该知道它们的 UIViewController。

我的结论是视图逻辑应该在 UIView 的 UIViewController 存在时进入,否则在 UIView 本身中。

或者,为 不是 UIViewController 子类的视图创建控制器类是否更好? UIPopoverController(一个 NSObject 子类)似乎遵循这种模式,尽管在大多数情况下(UIButton 等)视图似乎没有专用的控制器类。

【问题讨论】:

  • 另外,UIViewControllers 是否应该在没有 nib/xib 文件的情况下使用(即,在代码中创建的 UIView)?
  • 就我个人而言,我很少使用 NIB 文件,所以是的,你完全可以使用 UIViewController 和没有它们的朋友。
  • -initWithNibName:bundle: 是 UIViewController 的指定初始化器这一事实似乎表明它不打算在没有 nib 的情况下使用。
  • initWithNibName:bundle: 的参数名称是nibNameOrNilbundleOrNil,这表明它打算以任何一种方式使用。
  • @Alex:有趣的花絮,谢谢。

标签: cocoa-touch model-view-controller design-patterns uiviewcontroller ios


【解决方案1】:

我来自 Win32 + .NET + Java Swing GUI 世界,我曾经做过同样的事情。但后来我改正了我的邪恶方式。现在我唯一一次将代码放入 UIView 是如果我希望自定义 VIEW ITSELF(例如 OpenGL 绘图)。

控制器设置视图的状态。视图呈现其状态。

【讨论】:

    【解决方案2】:

    应用程序逻辑不应该放在UIView 中。时期。 UIViewController 的目的是管理视图及其子视图,并且在大多数情况下,它是逻辑的适当位置。 UIKit 遵循模型-视图-控制器范式。模型保存数据,视图显示并接受输入,控制器管理其他两层之间的交互。这就是为什么控制器是应用程序逻辑的逻辑位置。在 iOS 中,UIViewController 及其子类是常用的控制器类。我建议 reading up on Apple's guidance 更好地理解这种模式以及它在 iOS 中的使用方式。

    Apple 文档中的引述告诉您,您不会为每个标签或按钮创建UIViewController。您为应用程序的每个“页面”或“屏幕”创建一个,并使用它来管理该视图中的控件。请注意,UIKit 具有管理表格视图、选项卡视图和导航视图的类。这就是您将使用UIViewController 管理的对象级别。

    我建议浏览 SDK 中包含的 iOS 示例。它们应该让您很好地了解框架期望应用程序的结构。

    【讨论】:

    • UISwitch(或任何其他控件)怎么样?它是一个 UIView 子类,它管理自己的状态。
    • 管理自己的状态并不是我所说的逻辑。我的意思是应用程序逻辑,例如决定向用户显示对话框或保存文件。 UISwitch 应该知道它是打开还是关闭,但它不应该负责将其值保存到用户的首选项文件中。这就是视图控制器的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2014-10-07
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多