[英]Perform action on UISearchBar when Keyboard is down and the x has been tapped
我有一个顶部带有UISearchBar
的UITableView
,并且有一个不起作用的特定要求。
我的UISearchBar (showsCancelButton = NO)
上没有取消按钮UISearchBar (showsCancelButton = NO)
因此我完全依赖UISearchBar
内的x来取消现有搜索。 我依靠键盘的“搜索”按钮关闭键盘(尽管在我的情况下称为“完成”)。
当用户在我的应用程序中搜索时,我将禁用navigation bar button
项,因为它给用户带来不好的体验,并且只有在搜索取消后,用户才能重新获得导航栏按钮项。 都可以了
我有一个特殊的场景,尽管我无法绕开。
1)点击搜索栏以输入文本
2)在键盘上单击“完成”,键盘将消失
3)在键盘退回的情况下,x保留在UISearchBar
4)点击UISearchBar
的x, SearchBar
的文本消失,视图刷新
5)此时,应该再次启用导航栏按钮,但是没有启用。
码:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
self.timelineSearchBar.showsCancelButton = NO;
if ([searchText length] == 0)
{
[self.timelineSearchBar performSelector:@selector(resignFirstResponder)
withObject:nil
afterDelay:0];
}
我知道上面的代码旨在在按下x时关闭键盘,这很好。
就我而言,键盘已经被辞职了,因此我希望点击x即可重新启用导航栏项。
self.addButton.enabled = YES;
因为上面的if语句根本不执行任何操作,并且导航栏项仍处于禁用状态。
我什至尝试了if语句:
[self.timelineSearchBar performSelector:@selector(enableAdd)
withObject:nil
afterDelay:0];
- (void)enableAdd
{
self.addButton.enabled = YES;
}
但这会崩溃,说明searchBar不响应该enableAdd选择器。
我已经完成了一个断点,并且看到当我点击x时,上面的if语句的评估结果为true,它进入该语句,它“运行”代码以启用该按钮,但从未发生。
我的最终编辑方法是:
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
[searchBar setShowsCancelButton:NO animated:YES];
self.addButton.enabled = YES;
}
更新:我已经尝试过这里的链接http://engineeringtheworld.wordpress.com/2011/04/11/detecting-when-clear-is-clicked-in-uisearchbar-x-button/没有成功-textField的shouldClear方法不会被调用。 我正在使用iOS 7,所以也许还有另一种方法可以将视图嵌入到textFields中? 这很可能是正确的方法,但是它不适用于我的代码,因为该示例中的for语句永远不会被评估为true(我放入NSLog中)。
更新2:从上面的if语句中,我调用了searchBarCancelButton方法,并且导致了极端循环,因此,这当然不是正确的方法:
[self performSelector:@selector(searchBarCancelButtonClicked:) withObject:self.timelineSearchBar afterDelay: 0];
任何对此的指导将不胜感激。 我知道我错过了关键一步,但我只是想不通。
问题是,轻敲X按钮时, searchBar:textDidChange:
之前被称为searchBarShouldBeginEditing:
即,这里是调用流程: searchBar:textDidChange:
-> searchBarShouldBeginEditing:
-> searchBarTextDidBeginEditing:
-> searchBarTextDidEndEditing:
textDidChange
的设置启用为YES,但然后shouldBeginEditing
再次将其禁用。 这对我来说非常合适:
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
self.addButton.enabled = NO;
}
-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
if(searchBar.text.length == 0){
self.addButton.enabled = YES;
}
}
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if ([searchText length] == 0)
{
[searchBar performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0];
}
}
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
self.addButton.enabled = [searchBar.text length] == 0;
[searchBar resignFirstResponder];
}
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if([searchText length] == 0 && searchBar.text.length == 0)
{
self.addButton.enabled = YES;
[searchBar performSelector: @selector(resignFirstResponder)
withObject: nil
afterDelay: 0.1];
}
}
为了清楚起见,我在这里创建一个答案,但是尽管我的代码可以正常工作,但是Michaels的答案在很大程度上为这提供了帮助,并且是这里公认的方法。
我对NSLogs
进行了很多研究,有趣的是,我发现shouldBeginEditing
出现在textDidChange
之前(按照textDidChange
的顺序)。
但是,我还注意到,在原始问题的步骤中,关闭了键盘,并在UISearchBar中包含了文本,并且x可见,如果我轻按x,则不会出现键盘,但是它再次调用了shoudlBeginEditing
。
这是导致addButton继续变灰的方法,因为该方法将该按钮设置为禁用。
所以我调整了代码:
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)bar
{
NSLog(@"Should begin");
if ([self.timelineSearchBar.text length] > 0)
{
self.addButton.enabled = NO;
}
else
{
self.addButton.enabled = YES;
}
self.timelineSearchBar.showsCancelButton = NO;
BOOL boolToReturn = self.shouldBeginEditing;
self.shouldBeginEditing = YES;
return boolToReturn;
}
我将if条件放在其中,以便在用x取消后返回到searchBar时,代码可以适当地做出反应。
这样,添加按钮不会在我单击UISearchBar
(弹出键盘)后立即禁用。 但是,在textDidChange
(这是我看到的从键入的第一个字母开始调用的内容)中,我也设置了以下条件:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
NSLog(@"Text did change");
self.timelineSearchBar.showsCancelButton = NO;
if ([self.timelineSearchBar.text length] > 0)
{
self.addButton.enabled = NO;
}
...
}
这样, UISearchBar
仅在我开始输入字母时才显示添加按钮。 这为我工作,因为如果用户轻敲上UISearchBar
并没有在任何类型,在prepareForSegue
那去认为,添加条目在呼唤,我检查,如果搜索栏isFirstResponder
如果是这样,我resignFirstResponder
。
考虑到这一点,我不确定这是否是Apple的处理方式,但这很干净。 我会尽快知道我的应用是否因此而因此而被拒绝,但是非常感谢Michaels的帮助; 您确实为解决整个我整个下午问题的正确方向指明了方向!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.