【问题标题】:Attaching gesture recognizers / action methods to views violate model view controller?将手势识别器/操作方法附加到视图违反模型视图控制器?
【发布时间】:2011-12-17 00:49:59
【问题描述】:
想问问大家对此的看法。我有一个 uiimageview 子类,在它的初始化程序中,我向 imageview 添加了一些手势识别器,并且我还在类中包含了手势识别器委托方法。我的问题是,这是否违反模型视图控制器?所有与控制视图有关的代码都应该在视图控制器中吗?与说一样,将按钮操作方法放在视图中。总之,有兴趣听听意见。
【问题讨论】:
标签:
iphone
objective-c
ios
cocoa-touch
model-view-controller
【解决方案1】:
在某种意义上,是的,这违反了 MVC 模式。正如您所说,视图不应该与如何控制它有任何关系,将此类代码分组到应用程序的另一部分是一个更好的习惯。
此外,OOP 的一大优势是能够重用类。这样的视图可以毫无问题地重用,因为所有控制代码(特定于应用程序)都不在其中。
如果您在视图中包含委托方法,您将无法重用它,或者您每次都必须更改委托方法!
但规则是针对一般情况的。看一下 Mac OS X 的 Cocoa 框架:您已经获得了可可绑定,它允许您直接更改视图内容以响应模型中的数据更改。这在某种程度上也违反了 MVC 模式。
另一个例子,参见 UIViewController。它必须是一个控制器,但它与一个视图如此紧密地联系在一起,以至于问题仍然存在。视图和控制器之间的分离并不像 MVC 所希望的那样明确。
最后,我想说遵循模式(只要它们符合您的需求)以及使用给定框架遵循它的方式是一个好习惯。但在某些情况下,如果你明确表示,创建一些捷径并打破规则可能会很有趣。
【解决方案2】:
如果操作只会影响视图的外观,这似乎是一个非常好的主意。例如,将平移手势识别器附加到视图以拖动它似乎是个好主意。
但是,如果它会在您的应用程序中触发更广泛的影响,那可能不是正确的方法。