2016-07-29 29 views
0

以下UIResponder方法在屏幕上报告的原始触摸:在UIView子类中实现UIResponder触摸方法是否违反了MVC?

- touchesBegan:withEvent: 
- touchesMoved:withEvent: 
- touchesEnded:withEvent: 

最近我用UIView子类,我想成为接触响应玩。

最初我在UIViewController中实现了上述方法,该方法负责所讨论的视图。

但是,我意识到只要UIViewControllers视图被触摸,触摸方法就被调用,而不是我想要的子视图。

我重新实现了UIView子类中的方法,并且一切按预期工作。

但我觉得这是违反MVC。我的视图中有控制逻辑。

我应该保持UIViewController的内部实现,而不是方法,并以某种方式命中测试解释其观点被感动了,还是我纠正具有UIView子类中实现的方法?

我觉得后面是懒惰的出路。

谢谢你的时间。

+0

你应该在视图中覆盖它。你的观点如何可以重复使用?你不必在每个有一个视图控制器的'UIButton'中实现触摸处理,它就会响应触摸事件本身。 – dan

+0

这不违反MVC吗? – Woodstock

+3

你肯定可以在违反MVC的方法内部做事,但是重写它们本身并不违反MVC。 'UIView'是'UIResponder'的一个子类。 – dan

回答

1

在MVC中,视图负责用户交互。因此,在您的UIView中重写您的UIResponder方法会更有意义。为了严格遵守MVC,您应该使用delegate pattern(或其他某种模式)来调用控制器中的控制逻辑功能。

enter image description here

上面的影像是从(Apple's MVC documentation)。与你的问题有关的部分位于左上角。该视图应该告诉控制器它已被触摸等,并且控制器应执行该逻辑。

UIViewController只能够实现这些方法,因为它带有内置视图。这是令人困惑的,因为这意味着UIViewController本身违反了MVC,但这是一个更加涉及的讨论。

+0

有趣,谢谢你的回复。那么我的UiView应该把它的中心点更新委托给UIViewController吗? – Woodstock

+0

不知道具体情况,我很难给你一个很好的答案,但可能不是。你应该问自己什么viewController真的需要知道。我猜想你可以传回更通用的东西。话虽如此,我认为建立任何只有MVC的大型项目是困难的,有时对于小型项目来说,它不值得花时间去做所有'正确'的方式。一旦你开始建设,你最终会遇到一些问题,这些问题将证明为什么使用某些设计模式很重要,这是一种更有意义的学习方式。 – CarlNathan

相关问题