ios响应程序链-视图如何捕获事件?

ios响应程序链-视图如何捕获事件?,ios,objective-c,Ios,Objective C,根据“如果视图由视图控制器管理,并且视图无法处理事件,则视图控制器将成为下一个响应者” 这句话是什么意思? 视图是否可以在内部定义事件的处理程序并从本质上捕获它?如果不是这种情况,则如果视图的ViewController已显式定义事件的处理程序,则将调用该视图的ViewController 视图处理事件似乎与MVC模式相反,或者文档真的说调用了特定于视图的控制器上的处理程序吗?UIView实际上已经有了可以覆盖的事件处理程序。您可以子类化UIView,并使用以下方法处理触摸事件: - (void

根据“如果视图由视图控制器管理,并且视图无法处理事件,则视图控制器将成为下一个响应者”

这句话是什么意思? 视图是否可以在内部定义事件的处理程序并从本质上捕获它?如果不是这种情况,则如果视图的ViewController已显式定义事件的处理程序,则将调用该视图的ViewController


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

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
视图和视图控制器之间有两种通信方式。通常,视图控制器通常告诉视图要显示什么,并且当事件发生时,视图倾向于调用委托方法。但我明白,您通常希望这些事件处理程序由视图调用,但在视图控制器中处理。但是

  • 您可以通过
    UIView
    免费获得这些方法,它们与视图特别相关
  • 您可以将其视为更接近视图的低级委托方法
  • 假设您有两个静态内容,用户触摸视图时,内容会翻转。是的,您可以(有些人会说应该)将视图和视图控制器分开,但这是一段非常简单的代码,与视图直接相关,因此将其放在一起实际上可能会更简单、更简洁
  • 除了MVC还有其他设计模式,苹果不一定只需要为一种设计模式提供工具
    有一个响应程序链,由每个UIResponder的
    nextResponder()
    组成:

  • 我们从UIView开始

  • 如果此UIView是UIViewController的
    视图
    ,则该UIViewController。(这就是你引用的那篇文章所说的。)

  • UIView的超级视图

  • 返回步骤2并重复!不断重复直到我们到达

  • 窗户

  • UIC应用程序

  • UIC应用程序的委托

  • 某些消息不是发送给特定对象,而是发送到响应者链的上游。我们从一个特定的对象开始,但是如果该对象没有方法的实现,我们不会崩溃;取而代之的是,我们走在响应者链上,寻找链上更高的人,他们确实有该方法的实现。此外,如果我们从未找到这样的实现,我们不会崩溃;消息从链的末端脱落,不会受到惩罚

    这类信息主要有两条:

    • 触摸事件

    • 没有针对性的行动


    至于你的问题,这和MVC有什么关系。。。?没有什么。正如乔什·加夫尼(Josh Gafni)正确的回答所说,MVC并不是世界上唯一的模式。这是关于响应者的,而不是关于MVC。

    有关响应者链的更多信息,以及链上出现的触摸事件和无目标操作的实际示例,请参阅我的书:谢谢,你的书确实澄清了苹果文档中提出的一些问题。