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时的响应链的更多相关文章

  1. 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理

    1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...

  2. 事件分发&响应链

    iOS的三种事件:触摸事件/运动事件/远程控制事件 typedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteCon ...

  3. iOS-UIResponse之事件响应链及其事件传递

    UIResponse之事件响应链及其事件传递 我们的App与用户进行交互,基本上是依赖于各种各样的事件.一个视图是一个事件响应者,可以处理点击等事件,而这些事件就是在UIResponder类中定义的. ...

  4. iOS利用响应链机制点击tableview空白处关闭键盘-可以作为参考

    http://www.jianshu.com/p/9717b792599c   是原文地址 处理关闭键盘的做法一般分为两种:1.放弃第一响应者身份:2.当前视图结束编辑.通常情况下只要我们在合适的时机 ...

  5. hitTest,UIWindow sendEvent ,touchbegan, 响应链

    https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/using_responders_and_th ...

  6. Objective-C 事件响应链

    苹果app使用响应者对象(responder object)来接收和处理事件.响应者对象是NSResponder及其子类的实例,如NSView.NSViewController和NSApplicati ...

  7. iOS开发 - 事件传递响应链

    序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为,操作系统把包含这些点击事件的信息包装成UITouch和UI ...

  8. tableView cell 设置圆角 响应链

    1.  tableView的样式必须为 UITableViewStyleGrouped 样式否则cell设置的圆角无效. 2. delegate用weak和assign的区别: A:用weak修饰是为 ...

  9. iOS学习9_事件分发&响应链

    iOS的三种事件:触摸事件/运动事件/远程控制事件 typedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteCon ...

随机推荐

  1. 【转】Linux中的LVM

    转自:http://www.cnblogs.com/net2012/p/3365904.html 逻辑卷管理器,通过将另外一个硬盘上的分区加到已有文件系统,来动态地向已有文件系统添加空间的方法. 逻辑 ...

  2. [转]Linux之ACL权限

    转自:http://www.2cto.com/os/201110/108736.html 引言 前面的内容中,我们讲到传统的权限仅有三种身份(owner,group,others)搭配三种权限(r,w ...

  3. MVC系列学习(十)-生成URL与表单

    本次学习,在路由配置信息中,有两个路由规则,在网站第一次启动的时候,注册了两个路由表 1.动态生成url A.在路由规则中,因为Default在前面,所以最新找到该路由表,此时不管 自己定义的控制器名 ...

  4. 关于编辑器对<input>标签报错提示“表单输入没有相关label”的问题

    相信很多朋友在制作表单的时候,我们的编辑器会有下图的相关提示吧 我们发现虽然这样并不影响我们的正常使用,但是看着这样的报错提示总是很让人心烦,那么这到底是为什么呢? 其实,这是因为编辑器建议我们在使用 ...

  5. Windows开发小问题集

    ON_BN_KILLFOCUS无效,因为需要BS_NOTIFY

  6. 【技术累积】【点】【java】【26】@Value默认值

    @Value 该注解可以把配置文件中的值赋给属性 @Value("${shit.config}") private String shit; 要在xml文件中设置扫描包+place ...

  7. crontab错误处理

    crontab任务跑着跑着突然停了,莫名奇妙,查看日志,发现以下错误: 网上搜了一下报错,提示说是调整打开最大进程数,设置如下

  8. php连接数据库的两种方式

    一.mysqli方式连接数据库 $mysql_conf = array( 'host' => 'localhost:3306', 'db' => 'ssql', 'db_user' =&g ...

  9. 跟着alex学习了格式化输出,最大的感受就是编程这个事,一定要自己动手去做,才能学会。看会和自己会做完全是两码事

    学习了三天,现在学到格式化输出.看视频教程,alex和那个美女学员打情骂俏,真是羡慕啊. 教程看懂很容易,完全会了. 可是上手编程马上歇菜. 就这么几行的代码,我遇到了n多错误 首先是中文输入的错误, ...

  10. Bequeath Connection and SYS Logon

    The following example illustrates how to use the internal_logon and SYSDBA arguments to specify the ...