【问题标题】:Is it necessary to create a separate view class when using MVC?使用MVC时是否需要创建单独的视图类?
【发布时间】:2011-12-05 21:28:56
【问题描述】:

观看斯坦福 iTunesU CS193p 在线课程后,我有一个关于实现 MVC 设计的正确方法的快速问题。

通常当我做一个应用程序时,我将我的视图设置为控制器的一部分,并向其中添加 UIButtons、UILabels 等。本质上,控制器和视图合而为一,除非您将 UIObject 视为视图对象

在早期的 CS193p 示例之一中,导师在控制器对象遵循的视图上实现协议和委托属性之前,将视图作为单独的对象(子类化 UIView)从控制器中分离出来。

我只是对 CS193p 设计的实用性感到好奇,我可以理解拆分视图更好地代表了 MVC 设计范式(尤其是作为教学辅助工具),但对其在实际应用中的应用略有怀疑。

【问题讨论】:

    标签: iphone objective-c model-view-controller


    【解决方案1】:

    将“视图”想象为 UIButton 和 UIImageView 等对象;可重用的组件不一定对应用程序的其余部分一无所知。您的视图控制器是负责配置视图对象并管理其状态的对象。

    有时您会想要继承 UIView,主要是当您需要在 drawRect: 中进行自定义绘图时。不过,您不会继承 UIView 来自定义行为,这就是您的视图控制器的用途。例如,您不会继承 UITableView 而只是让表格视图成为自己的委托。相反,你会让你的视图控制器成为表格视图的委托。

    【讨论】:

    • 非常感谢您的回答,我所指的示例确实实现了 - (void)drawRect:(CGRect)rect 所以这很可能是使用 UIView 子类的原因。再次感谢,我没有注意到。
    【解决方案2】:

    在 iOS 中,UIView 类实现了绘图刷新和触摸处理程序,而不是视图控制器类。如果你需要drawRect:或者touchesBegan:等,你需要一个单独的UIView子类。

    这部分可能是因为按钮和标签本身也是如此。他们重绘自己,并委托处理过的触摸。视图控制器不会绘制它们的内容并跟踪 xy 位置。

    【讨论】:

    • 感谢您解释与 - (void)drawRect:(CGRect)rect 相关的 UIView 子类的必要性,我现在了解我引用的示例中发生了什么。
    【解决方案3】:

    这不是绝对必要的。如果您使用 Interface Builder,您将构建自定义视图(将 UI 设置代码从您的业务代码中分离出来)的大部分原因都得到了解决。但是,如果您想为您的视图构建自定义操作,或者设置一些您无法通过 IB 获得的属性,那么将您的视图拆分为一个单独的类是有意义的。

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 2015-10-10
      • 2016-03-26
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      相关资源
      最近更新 更多