UIResponder简要

关于UIResponder,我这边就简要的说一下响应链,firstResponder

1.响应链:

在UIResponder中有一个非常重要的概念叫做Responder Chain,个人的理解是这是按照一定规则组织的响应、处理事件的一条链表。在了解UIResponder之前还得在了解一个概念Hit-Testing。在IOS中通常使用hit-testing去找到那个被触摸的视图。这个视图叫hit-test view,当IOS找到hit-test view后就把touch event交个那个视图来处理。下面画个图来说明一下,当点击视图E时看一下hit-testing的工作过程。

1.确定改触摸事件发生在view A范围内,接下来测试view B以及view C。

2.检查发现事件不再view B范围内发生,接下来检查view C发现触摸事件发生在了view C中,所以检查 view D,view E。

3.最后发现事件发生在view E的范围内所以view E成为了hit-test view。

摘自:http://blog.csdn.net/jimzhai/article/details/23283515

Responder Chain 是由responder对象组成的

responder chain是由一系列responder对象连接起来的,他从第一个responder对象开始一直到application对象结束。如果第一个responder不能够处理该事件则该事件会被发送到下一个在该responder chain中的responder来处理。

当自己定义的一个类想让他成为first responder时需要做两件事:

1.重写 canBecomeFirstResponder 方法让他返回YES

2.接受 becomeFirstResponder 消息,如果必要的话可让对象给自己发送该消息。

在这里有一个地方需要注意,当把一个对象变为first responder是要确保这个对象的图形界面已经建立起来,也就是说要在viewDidAppear中调用becomeFirstResponder方法。如果在veiwWillAppear方法中调用becomeFirstResponder将会得到一个NO。

Responder Chain 遵循一个特定的传播路径

如果hit-test view不能够处理该事件则UIKit会将事件传递给下一个Responder。下图则显示了事件在Responder Chain中传播的两种方式:

对于左边的app中事件传播路径如下:

1.初始的界面尝试去处理事件后者消息,打他处理不了则把事件交给它上一层视图处理,因为最开始的界面在他的view controller里的视图层次里不是最上层的。(这里的上下是按照树的结构而言的,下图解释:)

2.上层视图尝试处理事件,如果他不能处理则将事件交给他的上层视图处理,原因同上。

3.在view controller中最上层的视图尝试处理,他也不能处理则交给他的view controller来处理。

4.view controller也无法处理则交给window来处理。

5.window无法处理交给app object来处理

6.app object无法处理则将该事件丢弃掉。

右边的传播方式稍有不同:

1.一个视图在他的view controller 的视图层中向上传播一个事件直到它到达最顶层视图。

2.最顶层视图无法处理将event交给他的view controller来处理。

3.view controller 传递事件到他的最顶层视图的上一层视图,接下来重复1-3的步骤直到事件到达root view controller。

4.root view controller将事件传递到window object。

5.window 将事件传递给app object。

注意:事件,消息不要自己向上传送而要调用父类中的方法来处理,让UIKit来处理消息在responder chain中的传递。

2.关于firstResponder

2.1 在textfield中我们知道只要将textField becomeFirstResponder 那么就会弹起键盘,那么如果是别的呢?

2.2 后来实验发现,

首先要能成为firstResponder 就要实现这个方法

  

- (BOOL)canBecomeFirstResponder {
    return YES;
}

   然后需要新建一个属性

@property (nonatomic,strong) UIView *inputView;

记住,你没看错,就是叫inputView,跟textField一样,你不能叫别的名字,然后将inputView实例化,就能弹出来了,

  说实话,我刚看到别人这么写的时候,总感觉不可能,然后就没去实验,不过貌似事实就是这样,只要我们给inputView一个值,那么就会像键盘一样弹起的。

时间: 2024-10-30 16:31:38

UIResponder简要的相关文章

linux命令格式,获取帮助及其目录结构简要理解

我们都知道,一台计算机要是没通电,和一堆废铁没什么区别.那么,通电开机进入系统后,会进入交互界面,等待用户操作,人与计算机交互界面有两种: GUI:图形用户接口.如我们平时使用的Windows  ,linux的X window,有KDE和GOME. CLI:命令行接口,使用的SHELL类型有bash ,csh,tcshell,zshell等. 例如:[[email protected] ~]# commandbin root:当前登录的用户名. dxlcentOS:当前主机的主机名.@是一个分隔

UIResponder响应链

一.概述 UIView与UIViewController的共同父类:UIResponder,对于点击touches一系列方法,UIView与UIViewController会做出一系列反应,下面从"如何找到点击的子view"和"如何根据响应链响应"两方面来认识UIResponder. 二. 如何找到点击的子view 当用户点击某一个视图或者按钮的时候会首先响应application中UIWindow一层一层的向下查找,直到找到用户指定的view为止. 比如上图,点击

0-Android编译系统简要介绍和学习计划

Android编译系统简要介绍和学习计划 来源:http://blog.csdn.net/luoshengyang/article/details/18466779 导语: 在Android源码环境中,我们开发好一个模块后,再写一个Android.mk文件,就可通过m/mm/mmm/make等命令进行编译.此外,通过make命令还可制作各种系统镜像文件,例如system.img.boot.img和recovery.img等.这一切都得益于Android编译系统,它为我们处理了各种依赖关系,以及提

用自己的话简要阐述struts2的执行流程

Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件.核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制.业务控制器Action和业务逻辑组件是需要用户来自己实现的.用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用. 基本简要流程如下:1.客户端浏览器发出HTTP请求.2.根据web

《亿人帮》与《新米公益》竞品分析报告(简要版)

<亿人帮>与<新米公益>竞品分析报告(简要版) --白斌 [email protected] iOS. APP版本皆为最新版 2016.12.12 竞品选择:<新米公益> 理由:都是互联网+公益,项目模式相同,两款APP均在2015年第二季度上线,SWOT四方面两者几乎是同样的起点.下面从产品的五个层次对二者进行分析并提出建议 一.战略层: 1.产品比较 产品名称 志愿者参与方式 slogan <新米公益> 走路.早起.答题 不止更好的自己 <亿人帮&

markdown简要说明显示样式

markdown 什么是markdown: ????Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. ??Markdown具有一系列衍生版本,用于扩展Markdown的功能(如表格.脚注.内嵌HTML等等),这些功能原初的Markdown尚不具备,它们能让Markdown转换成更多的格式,例如LaTeX,Docbook.Markdown增强版中比较有名的有Markdown Extra.MultiMarkdown. Maruku等

UIStoryboard和UIResponder

6.17 UIStoryboard //获取someboard中InitialViewController UIStoryboard *story = [UIStoryboard storyboardWithName:@"someboard" bundle:nil]; self.window.rootViewController = [story instantiateInitialViewController]; //获取someboard中identity为storyboardID

JavaScript权威设计--JavaScript函数(简要学习笔记十)

1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"likeZqz()".有些些函数是用作内部用的或者为私有函数通常以一条下划线为前缀,就像"_zqzName()". 2.以表达式方式定义的函数 如: var zqz=function (){ return "zhaoqize"; } 在使用的时候必须把它赋值给一个变

Android内存泄露分析简要思路

工作中遇到挺多需要分析内存泄露问题的情况,现在大致简要写下思路,等之后时间相对比较充裕再进行补充. 1.明白内存泄露的判断依据? 个人总结为:持续增加,只增不减! 理解一下这8个字,配合几个命令和工具来确定一下你的应用是否存在内存泄露问题,这是很关键的,如果一开始就判断错误了,那么没有继续往下进行的理由. 命令如下: adb shell dumpsys meminfo 应用包名 [当然,比较粗略地话,可以用adb shell procrank] 这时候你可以看到一个内存使用情况表 而我们首先关注