【问题标题】:Does implementing UIResponder touch methods inside a UIView subclass violate MVC?在 UIView 子类中实现 UIResponder 触摸方法是否违反 MVC?
【发布时间】:2016-12-04 09:22:01
【问题描述】:

以下UIResponder 方法报告屏幕上的原始触摸:

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

最近我在玩 UIView 子类,我希望它具有触控响应能力。

最初,我在负责相关视图的UIViewController 中实现了上述方法。

但是,我意识到每当触摸 UIViewControllers 视图时都会调用触摸方法,而不是我想要的子视图。

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

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

我是否应该保留在 UIViewController 中实现的方法,并以某种方式命中测试 来解释哪个视图被触摸,或者我在 UIView 子类中实现方法是否正确?

我觉得后者是偷懒的出路。

感谢您的宝贵时间。

【问题讨论】:

  • 您应该在视图中覆盖它。你的视图还有什么可重用的?您不必在每个拥有一个视图控制器的视图控制器中实现UIButton 的触摸处理,它会响应触摸事件本身。
  • 这不违反 MVC 吗?
  • 您绝对可以在违反 MVC 的方法中做一些事情,但覆盖它们本身并不会违反 MVC。 UIView 是 UIResponder 的子类,这是有原因的。
  • 谢谢@dan,移动视图本身是否违反?

标签: ios iphone uiview uikit uiresponder


【解决方案1】:

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

上图来自(Apple's MVC documentation)。与您的问题有关的部分位于左上角。视图应该告诉控制器它已经被触摸等,控制器应该执行逻辑。

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

【讨论】:

  • 很有趣,感谢您的回复。那么我的 UiView 是否应该将中心点的更新委托给 UIViewController?
  • 不知道具体情况,我很难给你一个很好的答案,但可能不会。你应该问问自己 viewController 真正需要知道什么。我猜你可以传回更通用的东西。话虽如此,我认为很难构建任何仅使用 MVC 的大型项目,有时对于较小的项目,不值得花时间以“正确”的方式做所有事情。一旦你开始构建,你最终会开始遇到问题,这些问题将证明为什么使用某些设计模式很重要,这是一种更有意义的学习方式。
猜你喜欢
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多