UISearchBar作为inputAccessoryView时的响应链
UISearchBar对象做为一个普通的视图对象加入到视图控制器的self.view中,定义、初始化、设置delegate。然后becomeFirstResponder,最后resignFirstResponder。
CGRect searchBarFrame= CGRectMake(0, 0, self.view.frame.size.width, 40);
_searchBar = [[UISearchBar alloc] initWithFrame:searchBarFrame];
[_searchBar setPlaceholder:@"Search"];// 搜索框的占位符
//[_searchBarsetPrompt:@"Prompt"];// 顶部提示文本,相当于控件的Title
[_searchBar setBarStyle:UIBarStyleDefault];// 搜索框样式
[_searchBar setTintColor:[UIColor blueColor]];// 搜索框的颜色。当设置此属性时,barStyle将失效
[_searchBar setTranslucent:YES];// 设置是否透明
//[_searchBarsetShowsCancelButton:YES];// 是否显示取消button
//[_searchBarsetShowsCancelButton:YES animated:YES];
_searchBar.delegate=self;
[self.view addSubView:_searchBar];
这一切非常正常,也非常自然。
可是,这里的应用环境是将searchBar作为一个uiresponder子类的对象gridview的inputAccessoryView。
这样他的响应链条就复杂了。
我開始在searchBarTextDidBeginEditing方法中将searchBar的cancelButton展现出来。然后在searchBarTextDidEndEditing方法中将cancelButton关闭。
可是。我不管在cancel操作、search操作,及触摸虚拟键盘以外的点以调用视图控制器上的touchbegin方法,来resignFirstResponder。
这三个调用方法。都能将searchBar的第一响应者resign掉,但就是不能调用searchBarShouldEndEditing。
在整个响应链条中,当gridview变成firstResponder时,searchBar做为inputAccessoryView出现。再触摸searchBar的搜索框时。firstResponder发生了变化。
gridview不再是firstResponder,searchBar变成了firstResponder。再searchBar进行resignFirstResponder后。gridView又变成了firstResponder。
这个过程理解好,在应用中须要小心处理好这样的响应链条的传递操作。
不知道是不是由于firstResponder还在,所以没有调用作为searchBar的delegate的searchBarTextDidEndEditing方法。
将searchBar的delegate全部方法研究一下,发现还有两个方法能够用,能够用来实现这样的cancelButton随着firstResponder变化而展现、消失。
这两个方法是searchBarShouldEndEditing和searchBarShouldEndEditing,在firstResponder变化前都会调用这两个方法。
在触摸searchBar的搜索框时。searchBar就变成了firstResponder,那么在这时。会调用searchBarShouldEndEditing。
在我们将searchBar的firstResponder身份取消时,又会调用searchBarShouldEndEditing。
那么。我们能够在这两个方法中实现我们要的功能。
结论。关键是理解整个响应链条。
在视图控制器类中,gridview首先变成firstResponder。再searchBar变成firstResponder。
然后逐步resignFirstResponder,即使在self.view endEditing。也逐步操作。
代码
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
//无法调用 cancelbuttong 的 关闭功能, 妥协 不用这个吧。
// [_searchBarsetShowsCancelButton:YES animated:YES];
// 发现放到searchBarShouldBeginEditing 方法中也能实现这个功能,
// 在方法searchBarShouldEndEditing 中能够 将 cancelbutton 关闭掉。
}
-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
[_searchBar setShowsCancelButton:YES animated:YES];
BOOL xx,yy;
xx=[_gridView isFirstResponder];
yy=[_searchBar isFirstResponder];
NSLog(@"_gridView,searchBar %d,%d",xx,yy);
return YES;
}
-(BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
{
[_searchBar setShowsCancelButton:NO animated:YES];
BOOL xx,yy;
xx=[_gridView isFirstResponder];
yy=[_searchBar isFirstResponder];
NSLog(@"_gridView,searchBar %d,%d",xx,yy);
return YES;
}
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
//无法调用 cancelbuttong 的 关闭功能, 妥协 不用这个吧。
// [_searchBarsetShowsCancelButton:YES animated:YES];
// 发现放到searchBarShouldBeginEditing 方法中也能实现这个功能。
// 在方法searchBarShouldEndEditing 中能够 将 cancelbutton 关闭掉。
}
-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
// 这种方法还是不能被调用。无法解释。
// [_searchBar setShowsCancelButton:NO animated:YES];
}
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
[_searchBar resignFirstResponder];
}
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
BOOL xx,yy;
xx=[_gridView isFirstResponder];
yy=[_searchBar isFirstResponder];
NSLog(@"_gridView,searchBar %d,%d",xx,yy);
[_searchBar resignFirstResponder];
xx=[_gridView isFirstResponder];
yy=[_searchBar isFirstResponder];
NSLog(@"_gridView,searchBar %d,%d",xx,yy);
// 当 searchbar 不是 first responder时,gridview自己主动变成了 first responder.
// 所以,searchbar不会变成 end editing,它也就不会调用searchBarTextDidBeginEditing:方法。这是推測,没理论依据,也没得到apple承认,也不是网上看到的文字。纯属个人猜想。
}
UISearchBar作为inputAccessoryView时的响应链的更多相关文章
- 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理
1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...
- 事件分发&响应链
iOS的三种事件:触摸事件/运动事件/远程控制事件 typedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteCon ...
- iOS-UIResponse之事件响应链及其事件传递
UIResponse之事件响应链及其事件传递 我们的App与用户进行交互,基本上是依赖于各种各样的事件.一个视图是一个事件响应者,可以处理点击等事件,而这些事件就是在UIResponder类中定义的. ...
- iOS利用响应链机制点击tableview空白处关闭键盘-可以作为参考
http://www.jianshu.com/p/9717b792599c 是原文地址 处理关闭键盘的做法一般分为两种:1.放弃第一响应者身份:2.当前视图结束编辑.通常情况下只要我们在合适的时机 ...
- hitTest,UIWindow sendEvent ,touchbegan, 响应链
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/using_responders_and_th ...
- Objective-C 事件响应链
苹果app使用响应者对象(responder object)来接收和处理事件.响应者对象是NSResponder及其子类的实例,如NSView.NSViewController和NSApplicati ...
- iOS开发 - 事件传递响应链
序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为,操作系统把包含这些点击事件的信息包装成UITouch和UI ...
- tableView cell 设置圆角 响应链
1. tableView的样式必须为 UITableViewStyleGrouped 样式否则cell设置的圆角无效. 2. delegate用weak和assign的区别: A:用weak修饰是为 ...
- iOS学习9_事件分发&响应链
iOS的三种事件:触摸事件/运动事件/远程控制事件 typedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteCon ...
随机推荐
- Spring Cloud (14) 服务网关-过滤器
Spring Cloud Zuul作为网关所具备的最基本的功能:路由,还具备另外一个核心的功能:过滤器. 过滤器 通过Spring Cloud Zuul实现的路由功能,我们的微服务可以通过统一的API ...
- [ NOIP 2009 ] TG
\(\\\) \(\#A\) \(Spy\) 给出两个长度均为\(N\)相同的样例串,建立第一个串各个字符向第二个串对应位置字符的映射,并用映射转换给出的长度为\(M\)第三个串,输入保证只有大写字符 ...
- Android项目实战_手机安全卫士home界面
# 安全卫士主页面# ###1.GridView控件 1.与ListView的使用方式差不多,也要使用数据适配器,通过设置android:numColumns控制显示几列 2.通过指定android: ...
- 关于jquery $.browser 报错问题
在调用 jquery 插件时,出现$.browser 报错,原来是jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version 等属性, 取而代之的是 $.su ...
- Google开源技术protobuf
1.protobuf简介 protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多.虽然是二进制数 ...
- 【sqli-labs】 less50 GET -Error based -Order By Clause -numeric -Stacked injection(GET型基于错误的整型Order By从句堆叠注入)
报错没有关闭,直接可以用UpdateXml函数 http://192.168.136.128/sqli-labs-master/Less-50/?sort=1 and UpdateXml(1,conc ...
- Django 更新字段
Django在1.7以后的版本提供数据迁移命令,用来在修改模型中的字段,更新到数据库 1. python manager.py makemigrations 命令用来创建迁移文件版本的 2. pyth ...
- if({1,0}, , )
=VLOOKUP(F2,IF({1,0},D2:D10,C2:C10),2,),用F2作为查找条件,对D列进行查找,如果改成{0,1}则是对C列为查找范围.返回内存数组,对F2进行精确查找. 为什么写 ...
- 【HTTP/S】透明代理、匿名代理、混淆代理、高匿代理有什么区别?
这4种代理,主要是在代理服务器端的配置不同,导致其向目标地址发送请求时,REMOTE_ADDR, HTTP_VIA,HTTP_X_FORWARDED_FOR三个变量不同. 1.透明代理(Transpa ...
- NGINX+PHP-FPM7 FastCGI sent in stderr: “Primary script unknown”
https://www.cnblogs.com/hjqjk/p/5651275.html 一开始是Nginx打开网页显示一直是拒绝访问.查看nginx日志是报错显示我的题目,然后就各种搜索解决啊! 百 ...