2011-12-05 37 views
3

在看完斯坦福大学的iTunesU CS193p在线课程后,我对实现MVC设计的正确方法提出了疑问。当使用MVC时,是否有必要创建一个单独的视图类?

通常当我做一个应用程序时,我将视图设置为控制器的一部分,并添加UIButtons,UILabels等。本质上,控制器和视图成为一体,除非算上UIObjects为视图对象

在早期CS193p例子之一导师从控制器拆分视图断作为一个单独的物体(子类的UIView),实施前控制器对象符合的视图上的协议和委托属性。我很好奇CS193p设计的实用性,我可以理解,更好地代表MVC设计模式(特别是作为教学辅助工具),但是它在实际应用中对它的应用稍有怀疑。

回答

4

将“视图”想象成诸如UIButton和UIImageView之类的对象;可重复使用的组件,它们不必知道应用程序的其他部分。您的视图控制器是负责配置视图对象并管理其状态的对象。

有些时候你想要UIView的子类,主要是当你需要在drawRect:做自定义绘图。你不会继承UIView来自定义行为,这就是你的视图控制器的用途。例如,你不会子类UITableView,只是让表视图自己的委托。相反,你会让你的视图控制器的表视图的委托。

+0

非常感谢你的回答,我所指的例子的确确实现了 - (void)drawRect:(CGRect)矩形,所以更有可能是使用UIView子类的原因。再次感谢,我没有注意到。 – fuzzygoat

1

这不是必须的。如果您使用Interface Builder,那么为什么要构建自定义视图(将UI设置代码从业务代码中解脱出来)的大多数原因都已处理完毕。但是,如果您想为视图构建自定义操作,或者设置一些您无法完全理解的属性,那么将视图分解为单独的类是有意义的。

+0

非常感谢,谢谢。 – fuzzygoat

2

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

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

+0

感谢您解释与 - (void)drawRect:(CGRect)rect有关的UIView子类的需求,现在我明白我引用的示例中发生了什么。 – fuzzygoat

相关问题