键盘关闭且点击了x时,对UISearchBar执行操作

时间:2014-04-08 12:21:26

标签: ios selector uisearchbar uisearchbardelegate

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

我的UISearchBar (showsCancelButton = NO)上没有取消按钮,因此我完全依赖UISearchBar中的x取消现有搜索。我依靠键盘"搜索"用于关闭键盘的按钮(虽然在我的情况下称为Done)。

当用户在我的应用中搜索时,我会禁用navigation bar button项,因为它会给用户带来不良体验,并且只有当搜索已取消时,用户才会返回导航栏按钮项。这一切都在起作用。

我有一个特殊情况虽然我无法绕过。

1)点击搜索栏以输入文本

2)单击键盘上的DONE,键盘将消失

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 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];

对此的任何指导都将非常感激。我知道我错过了一个关键步骤,但我无法弄明白。

3 个答案:

答案 0 :(得分:3)

问题是,点击X按钮时,searchBar:textDidChange:searchBarShouldBeginEditing:之前被称为

即。这是呼叫流程:searchBar:textDidChange: - > searchBarShouldBeginEditing: - > searchBarTextDidBeginEditing: - > searchBarTextDidEndEditing:

textDidChange设置为启用,但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];
}

答案 1 :(得分:0)

-(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];
    }
}

答案 2 :(得分:0)

为了清晰起见,我在这里创建了一个答案,但Michaels的答案大量帮助,这是我接受的方法,尽管我的代码工作正常。

我用NSLogs进行了很多挖掘,有趣的是,我发现shouldBeginEditing出现在textDidChange之前(按照NSLog的顺序)。

然而,我也注意到在原始问题的步骤中,键盘被解除,UISearchBar包含文本和x可见,如果我点击x,键盘没有出现,但它调用{{1}再次。

这是导致addButton继续变灰的方法,因为该方法将该按钮设置为禁用。

所以我调整了代码:

shoudlBeginEditing

我把if条件放在那里,这样如果我在用x取消后回到searchBar,代码会做出适当的反应。

这样,单击- (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; } (调出键盘)后,添加按钮就不会禁用。但是,在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进入添加条目正在调用的视图中,我检查了searchBar {{1如果是的话,我prepareForSegue

考虑到这一点,我不确定这是Apple的做事方式,但它很干净。如果我的应用程序因此被拒绝,我很快就会知道,但非常感谢你帮助Michaels;你真的指出了我正确的方向来解决整个下午的问题!