实现可以处理两种不同视图类型的视图控制器

时间:2011-03-15 21:12:01

标签: iphone model-view-controller

很抱歉,如果标题听起来很混乱,但我无法想出更好的内容。

基本上我有一个视图控制器来管理分页滚动视图,该视图显示从数据库中提取的多个图像。我是MVC的新手,我试图以最好的方式编写我的代码(我的经验仅仅是基于查看其他人的代码并了解Apple的类如何工作,因此它可能存在缺陷;如果你能告诉我它是否真的,我将不胜感激。

这就是我所做的:我有一个包含UIScrollView的自定义视图类,并且有两个公共属性:dataSourcedelegate。数据源对象必须符合我定义的协议;它返回图像数量和图像本身。当所选页面发生更改时,代理会收到通知。

我希望我做对了。无论如何它都有效;我能够毫无问题地重新实现数据源(如果需要),并且提供数据的代码与显示它的代码分开。

但是现在我遇到了一个问题:我需要能够用类似CoverFlow的视图替换分页滚动视图,并尽可能少地复制代码。我知道必须有更好的方法来实现这一点,而不必使用此CoverFlow视图创建另一个视图控制器类。这两个视图类具有相似的方法并以类似的方式工作,因此使用相同的视图控制器代码而不是复制它是有意义的。

也许我可以用泛型方法编写一个抽象类并编写它的两个实现,一个用于滚动视图,一个用于CoverFlow视图,然后根据传递给它的参数在控制器中实例化其中一个。这是实现这一目标的最佳方式吗?

我希望这不会太混乱,我的方法也没有太大的缺陷。感谢。

2 个答案:

答案 0 :(得分:1)

  

也许我可以写一个摘要   用泛型方法编写的类   它的两个实现,一个用于   滚动视图和一个CoverFlow   查看,然后实例化其中一个   两个在控制器中,基于a   传递给它的参数。这是   实现这个目标的最好方法是什么?

这听起来像是一个不错的方法。

您还可以实现一个管理两种视图类型的视图控制器,在loadView中按需创建正确的视图。

答案 1 :(得分:1)

您通常需要单独的视图控制器用于单独的视图,因为您最终必须检查您在每种方法中使用的视图类型。然后特殊情况蔓延,你的代码变得一团糟。此外,您可能决定在某个时刻完全抛弃一个视图。代码越模块越好。

模型 - 视图 - 控制器设计的关键思想是视图在逻辑上与数据模型分离。该模型应该是程序的实际核心,它应该通过控制器为所有视图提供数据。如果您已正确实现了设计,那么您将无法进行太多自定义和少量代码重复,因为模型将支持每个可能的视图并进行更改。

在大多数应用中,控制器是最自定义的,您不应该花费太多精力来防止重复。如果您发现控制器之间存在重复的代码,那么控制器中的模型或视图逻辑很可能不存在。

在您的情况下,看起来数据源对象与您的模型接口(就像UITableViewDataSource对象一样),并且由于两个视图都使用相同的逻辑,因此如果您定义了适当的协议,则可以对两个视图使用相同的委托。每个视图都需要一个自定义委托来处理自定义,但这是您应该使用的Delegate设计模式的一部分。

相关问题