繁体   English   中英

按下键盘并轻按x时在UISearchBar上执行操作

[英]Perform action on UISearchBar when Keyboard is down and the x has been tapped

我有一个顶部带有UISearchBarUITableView ,并且有一个不起作用的特定要求。

我的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM