ios Responder chain - 视图如何捕获事件?

时间:2015-05-25 18:03:59

标签: ios objective-c

根据https://developer.apple.com/library/ios/documentation/General/Conceptual/Devpedia-CocoaApp/Responder.html,"如果视图由视图控制器管理,并且视图无法处理事件,则视图控制器成为下一个响应者"

这句话是什么意思? View可以在内部为事件定义处理程序并在内部捕获它吗?如果不是这样的话,如果视图的ViewController明确定义了事件的处理程序,那么它将被调用吗?

似乎与View处理事件的MVC模式相反 - 或者文档是否真的说调用了特定于View的控制器上的处理程序?

2 个答案:

答案 0 :(得分:2)

每个UIResponder的nextResponder()都有一个响应者链:

  1. 我们开始的UIView。

  2. 如果这个UIView是UIViewController的view,那就是UIViewController。 (这就是你引用的段落所说的。)

  3. UIView的超级视图。

  4. 回到第2步并重复!不断重复,直到我们到达......

  5. UIWindow。

  6. UIApplication。

  7. UIApplication的代表。

  8. 发送某些消息,而不是特定对象,而是发送响应者链。我们使用特定对象启动,但如果该对象没有该方法的实现,我们就不会崩溃;相反,我们走在响应者链上,寻找 拥有该方法实现的链上的某个人。而且,如果我们永远不会找到这样的实现,我们就不会崩溃;消息从链的末端掉落而不受处罚。

    有两种主要信息:

    • 触摸事件。

    • 无目标行动。

    关于你的问题,这与MVC有什么关系?没有。正如Josh Gafni的回答所说,MVC并不是世界上唯一的模式。这是关于响应者,而不是关于MVC。

答案 1 :(得分:0)

UIView实际上已经有了可以覆盖的事件处理程序。您可以使用以下方法继承UIView并处理触摸事件:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

View和View Controller之间有两种通信方式。通常,View Controller通常会告诉View要显示的内容,View会在事件发生时调用委托方法。我确实理解你通常希望这些事件处理程序由View调用,但在View Controller中处理。但...

  1. 您可以免费获得这些方法以及UIView,并且它们与视图特别相关。
  2. 您可以将它们视为更接近View
  3. 的较低级别委托方法
  4. 假设您有2条静态内容,并且只要用户触摸查看内容翻转。是的,您可以(有些人会说应该)在View和View Controller之间分开,但这是一个如此简单的代码,因此与View直接相关,它可能实际上不那么混乱,更简洁,可以将它保持在一起。
  5. 除了MVC之外还有其他设计模式,而Apple并不一定只需要为一种设计模式提供工具。