返回顶部
首页 > 资讯 > 移动开发 >解密ios响应链的工作原理
  • 640
分享到

解密ios响应链的工作原理

ios响应链ios事件响应链 2023-03-22 17:03:37 640人浏览 泡泡鱼
摘要

目录事件响应链的工作原理响应者对象的特点自定义事件处理事件传递和事件响应事件拦截事件传递到父视图自定义事件响应链总结事件响应链是 iOS 开发中的一个核心概念,它描述了系统将用户交互

事件响应链是 iOS 开发中的一个核心概念,它描述了系统将用户交互事件传递给最适合处理该事件的对象的过程。理解事件响应链的机制对于开发高质量的应用程序至关重要。本文将深入探讨事件响应链的工作原理,并提供 Swift 中的代码示例来帮助读者更好地理解这一概念。

事件响应链的工作原理

ioS 中,事件响应链的工作原理可以简单概括为:从最上层的 UIWindow 开始,依次向下传递事件,直到找到最适合处理事件的响应者对象为止。在这个过程中,每个响应者对象都有机会处理事件。

当用户执行一个操作时,如触摸屏幕或运动设备,系统会创建一个 UIEvent 对象,并将其发送到当前的第一响应者对象。如果第一响应者对象无法处理该事件,则系统会将该事件传递给响应者链中的下一个对象,直到找到能够处理该事件的对象。如果最终没有对象能够处理该事件,则事件被系统丢弃。

以下是事件响应链的示意图:

         UIWindow
             |
       UIViewController
             |
           UIView
             |
     subviews of UIView

在这个示意图中,UIWindow 是响应者链的起点,它是所有视图的根视图。UIViewControllerUIView 都是响应者对象,它们都可以处理事件。UIViewController 可以接收和处理来自其根视图的事件,而 UIView 可以接收和处理来自其自身的事件,以及来自其子视图的事件。

响应者对象的特点

响应者对象是一种特殊类型的对象,它们实现了 UIResponder 类。响应者对象可以处理事件,可以成为第一响应者对象,并且可以将事件传递给下一个响应者对象。以下是 UIResponder 类中的一些常用方法:

  • canBecomeFirstResponder:返回一个布尔值,指示对象是否可以成为第一响应者对象。
  • becomeFirstResponder:将对象设置为第一响应者对象。
  • resignFirstResponder:放弃第一响应者对象的地位。
  • next:返回响应者链中的下一个响应者对象。

响应者对象还可以实现许多方法来处理事件,例如:

  • touchesBegan(_:with:):当用户在视图上开始触摸时调用。
  • touchesMoved(_:with:):当用户在视图上移动触摸时调用。
  • touchesEnded(_:with:):当用户在视图上结束触摸时调用。
  • touchesCancelled(_:with:):当系统取消触摸事件时调用。

自定义事件处理

Swift 中,可以通过重写 UIResponder 子类的方法来自定义事件处理。以下是一个示例代码,展示如何重写 UIView 子类的 touchesBegan 方法来处理触摸事件:

class CustomView: UIView {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        
        // 处理触摸事件
        // ...
    }
}

在这个示例中,当用户在 CustomView 上开始触摸时,系统会调用 CustomViewtouchesBegan 方法。在此方法中,开发者可以编写自己的触摸事件处理代码。

事件传递和事件响应

事件传递和事件响应是事件响应链的两个重要环节。在事件传递阶段,系统会将事件从上往下传递,直到找到最适合处理事件的对象。在事件响应阶段,系统会将事件从下往上响应,直到事件被处理或者传递到响应者链的顶部。

在事件传递阶段,UIViewUIViewController 都有一个 hitTest( *:with:) 方法,该方法返回一个 UIView 对象。当系统接收到事件时,它会调用 hitTest(* :with:) 方法来确定最适合处理该事件的视图对象。hitTest( *:with:) 方法首先检查自己是否能够处理该事件,如果不能,它会将事件传递给其子视图,并递归调用子视图的 hitTest(* :with:) 方法,直到找到能够处理该事件的视图对象。

在事件响应阶段,系统会将事件传递到第一响应者对象,并沿着响应者链向上传递,直到事件被处理或者传递到响应者链的顶部。在这个过程中,每个响应者对象都有机会处理事件。如果某个响应者对象能够处理事件,则它将调用相应的方法来处理事件,例如 touchesBegan(_:with:) 方法。如果该对象不能处理事件,则它将调用 next 方法,将事件传递给响应者链中的下一个对象。

事件拦截

hitTest(_:with:) 方法中,我们可以检查触摸点是否在指定区域内,如果在,则返回当前视图作为拦截目标,否则返回 nil,让系统将事件传递给下一个响应者。示例代码如下:

class CustomView: UIView {
    
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if self.bounds.contains(point) {
            // 触摸点在视图内,拦截事件
            return self
        } else {
            // 触摸点不在视图内,将事件传递给下一个响应者
            return super.hitTest(point, with: event)
        }
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        print("CustomView touchesBegan")
    }
 
}

在上述代码中,我们重写了 hitTest( *:with:) 方法,并在该方法中检查触摸点是否在视图内。如果在,则返回当前视图作为拦截目标,否则返回 nil,让系统将事件传递给下一个响应者。在 touchesBegan(* :with:) 方法中,我们打印了一条日志,以便在触摸事件发生时能够看到该方法是否被调用。

事件传递到父视图

要将事件传递到父视图,可以调用 next?.touchesBegan(touches, with: event) 方法,让父视图处理触摸事件。示例代码如下:

class CustomView: UIView {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        
        // 处理触摸事件
        // 如果无法处理该事件,传递给父视图进行处理
        next?.touchesBegan(touches, with: event)
    }
}

class ParentView: UIView {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        
        // 处理触摸事件
    }
}

在上面的示例中,CustomViewParentView 都是 UIView 的子类。当用户在 CustomView 上触摸时,CustomViewtouchesBegan 方法会被调用。在这个方法中,如果 CustomView 无法处理该事件,它会将该事件传递给其父视图(ParentView)进行处理。

通过 next?.touchesBegan(touches, with: event) 方法将事件传递给父视图,如果父视图能够处理该事件,它的 touchesBegan 方法将被调用。在这个方法中,可以处理触摸事件。如果父视图仍然无法处理该事件,该事件将被传递给更高级别的响应对象进行处理。

需要注意的是,当事件被传递到下一个响应对象时,会调用该对象的 touchesBegan 方法。因此,在这个方法中,可以对事件进行处理,也可以将其传递给更高级别的响应对象进行处理。

自定义事件响应链

iOS 中,每个视图都是一个 UIResponder 对象。UIResponder 是一个抽象类,它定义了响应者对象可以处理的事件类型,包括触摸事件、加速计事件、远程控制事件等。每个 UIResponder 对象都有一个 next 响应者,即下一个响应者对象。当一个事件发生时,系统会将该事件从前往后依次传递给响应者链中的对象,直到某个对象处理了该事件为止。如果没有任何对象处理该事件,则该事件将被丢弃。

我们可以通过自定义 UIResponder 子类来实现更灵活的事件处理逻辑。下面是一个简单的自定义响应者链的示例代码:

class CustomResponder: UIResponder {
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        print("CustomResponder touchesBegan")
        next?.touchesBegan(touches, with: event)
    }
    
}

class ViewController: UIViewController {
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        print("ViewController touchesBegan")
    }
    
}

在上面的代码中,我们定义了一个名为 CustomResponder 的自定义响应者子类。在该类中,我们重写了 touchesBegan(_:with:) 方法,并在该方法中打印了一条日志。在该方法中,我们还调用了 next?.touchesBegan(touches, with: event) 方法,将触摸事件传递给下一个响应者对象。

在 ViewController 中,我们也重写了 touchesBegan( *:with:) 方法,并在该方法中打印了一条日志。当触摸事件发生时,首先会调用 CustomRespondertouchesBegan(* :with:) 方法,并打印出 "CustomResponder touchesBegan"。然后,由于我们调用了 next?.touchesBegan(touches, with: event) 方法,系统会将触摸事件传递给 CustomResponder 的下一个响应者对象,即 ViewController。此时,系统会调用 ViewControllertouchesBegan(_:with:) 方法,并打印出 "ViewController touchesBegan"。

通过自定义响应者子类,我们可以更加灵活地处理事件,实现更复杂的事件处理逻辑。例如,我们可以在响应者链中添加多个响应者对象,根据事件类型、触摸点位置等条件来决定哪个响应者对象处理该事件。

总结

事件响应链是 iOS 开发中的一个核心概念。了解事件响应链的工作原理和实现方式,可以帮助开发者更好地理解 iOS 应用的交互模型,编写更高效、可靠的交互代码。

以下是一些事件响应链的实践建议:

  • 在处理触摸事件时,始终调用父类的 touchesBegan( *:with:)touchesMoved(* :with:)touchesEnded( *:with:)touchesCancelled(* :with:) 方法。这样可以确保事件会正确地传递到响应者链的下一个对象。
  • 如果希望在事件传递过程中拦截事件,可以重写 hitTest(_:with:) 方法,并在该方法中检查事件是否应该被拦截。
  • 如果希望将事件传递到父视图,可以调用 next?.touchesBegan(touches, with: event) 方法。
  • 尽可能避免使用 touches 属性,因为该属性在多点触控环境下会出现问题。推荐使用 allTouches 属性来获取所有触摸点。
  • 尽可能避免使用 gesture recognizer 来处理触摸事件,因为这会增加系统的负担,并可能导致意外的行为。推荐使用触摸事件处理方法来处理触摸事件。

 以上就是解密ios响应链的工作原理的详细内容,希望本篇文章可以更好地帮助大家理解 iOS 应用的交互模型。更多精彩内容请大家继续关注编程网,我们将进行更多关于ios内容的更新。

--结束END--

本文标题: 解密ios响应链的工作原理

本文链接: https://lsjlt.com/news/200894.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 解密ios响应链的工作原理
    目录事件响应链的工作原理响应者对象的特点自定义事件处理事件传递和事件响应事件拦截事件传递到父视图自定义事件响应链总结事件响应链是 iOS 开发中的一个核心概念,它描述了系统将用户交互...
    99+
    2023-03-22
    ios响应链 ios事件响应链
  • ios响应链的工作原理是什么
    今天小编给大家分享一下ios响应链的工作原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。事件响应链的工作原理在 iO...
    99+
    2023-07-05
  • iOS 中事件的响应链和传递链
    iOS事件链有两条:事件的响应链;Hit-Testing事件的传递链 响应链:由离用户最近的view向系统传递。initial view –> super view –&...
    99+
    2022-05-27
    iOS 响应链 传递链
  • Python中HTTP响应的工作原理是什么?
    Python中HTTP响应的工作原理是什么? 在Python开发中,HTTP请求和响应是非常常见的操作。当我们发送HTTP请求时,服务器会返回一个HTTP响应。但是,你知道HTTP响应的工作原理是什么吗?在本文中,我们将深入探讨Python...
    99+
    2023-07-07
    http 响应 django
  • 解密PHP逻辑的工作原理
    PHP作为一种流行的服务器端脚本语言,在Web开发领域广泛应用。它的工作原理主要通过解析和执行用户输入的代码逻辑来动态生成网页内容。在本文中,我们将解密PHP逻辑的工作原理,并通过具体...
    99+
    2024-03-07
    php解密原理 php逻辑分析 php工作机制
  • 你了解Python响应文件框架的工作原理吗?
    Python是一种高级编程语言,它被广泛用于Web开发、数据分析、机器学习等领域。Python的一个重要特性是其丰富的库和框架,其中之一就是响应文件框架。这个框架非常有用,因为它可以帮助我们处理HTTP请求和响应,本文将介绍Python响应...
    99+
    2023-07-20
    响应 文件 框架
  • Cookie的工作原理和应用详解
    目录1. Cookie 原理1.1 Cookie 背景信息1.2 Cookie 工作原理1.3 Cookie 创建、获取、修改1.4 Cookie 共享范围1.5 Cookie 生命...
    99+
    2024-04-02
  • 数据加密和解密的工作原理是什么
    数据加密是指通过加密算法和加密密钥将明文转变为密,是利用密码技术对信息进行加密,实现信息隐蔽,从而起到保护信息的安全的作用;而数据解密则是通过解密算法和解密密钥将密文恢复为明文,其核心是密码学。数据加密的方法有替换和置换两种,替换是使用密钥...
    99+
    2024-04-02
  • 理解 Python 对象响应框架的工作原理:这是您需要知道的。
    Python 对象响应框架(Object-Response Framework)是 Python 中一个非常重要的概念。它的主要作用是让 Python 对象能够响应事件和消息,从而使得程序更加灵活和可扩展。本文将深入探讨 Python 对象...
    99+
    2023-10-03
    对象 响应 框架
  • 链接的科学:深入了解 HTML 超链接标签的工作原理
    ...
    99+
    2024-04-02
  • 详解VUE响应式原理
    目录1、响应式原理基础2、核心对象:Dep与Watcher3、收集依赖与更新依赖3.1 收集依赖3.2 更新依赖4、源码调试4.1 测试的页面代码1、对象说明2、Dep与Watche...
    99+
    2024-04-02
  • 详解Vue3的响应式原理解析
    目录Vue2响应式原理回顾Vue3响应式原理剖析嵌套对象响应式避免重复代理总结 Vue2响应式原理回顾 // 1.对象响应化:遍历每个key,定义getter、setter //...
    99+
    2024-04-02
  • 你知道吗?Java对象文件响应的工作原理是什么?
    Java是一种广泛使用的编程语言,它的对象文件响应机制是Java程序的重要组成部分。本文将深入探讨Java对象文件响应的工作原理,并提供演示代码,让读者对此有更深入的了解。 首先,让我们来了解一下Java中的对象文件。在Java中,对象文件...
    99+
    2023-09-10
    对象 文件 响应
  • SELINUX工作原理详解
    1. 简介 SElinux带给Linux的主要价值是:提供了一个灵活的,可配置的MAC机制。     Security-Enhanced Linux (SELinux)由以下两部分组成: ...
    99+
    2022-06-04
    SELINUX 工作原理
  • 详解MyBatis工作原理
    目录一、Mybatis工作原理二、Mybatis运行原理总结一、Mybatis工作原理 Mybatis分层框架图 Mybatis工作原理图 源码分析:一般都是从helloworl...
    99+
    2024-04-02
  • BeegoAutoRouter工作原理解析
    目录一、前言 二、从一个例子入手✨AutoRouter的解析规则:三、AutoRouter是如何工作的结语一、前言 Beego Web框架应该是国内Go语言社区第一个框架,个人觉得...
    99+
    2024-04-02
  • Springboot工作原理详解
    目录 一、Spring Boot 1.1.Spring Boot 优点  二、SpringBoot 运行原理 1.1. pom.xml  2.2. 主启动类的配置 3.3. 主启动类的运行 三、自动配置原理 3.1、启动类上注解的作用  3...
    99+
    2023-10-10
    spring boot java spring
  • reactSuspense工作原理解析
    目录Suspense 基本应用Suspense 原理基本流程源码解读 - primary 组件源码解读 - 异常捕获源码解读 - 添加 promise 回调源码解读-Suspense...
    99+
    2024-04-02
  • 深入理解z-index的工作原理和应用技巧
    目录前言1、z-index2、层叠上下文3、层叠水平4、层叠顺序5、创建层叠上下文小结前言 最近参与某前端项目架构改造,发现项目中滥用z-index,设置的值有几十种并且不统一。在对...
    99+
    2023-05-19
    z-index属性 z-index的用法 网页制作中层的z-index
  • 深入理解Vue3响应式原理
    目录响应式原理手写实现1、实现Reactive2、实现依赖的收集和触发effect影响函数收集/添加依赖触发依赖3、移除/停止依赖衍生类型1、实现readonly2、实现shallo...
    99+
    2022-12-19
    vue3响应式原理精讲 vue3 响应式 vue 响应式原理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作