2

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

我没有取消按钮,UISearchBar (showsCancelButton = NO)所以我完全依靠 x 中的 xUISearchBar来取消现有的搜索。我依靠键盘的“搜索”按钮来关闭键盘(尽管在我的情况下它被称为完成)。

当用户在我的应用程序中搜索时,我正在禁用某个navigation bar button项目,因为它会提供糟糕的用户体验,并且只有当搜索取消时,用户才会恢复导航栏按钮项目。这一切都在工作。

我有一个特殊的情况,但我无法解决。

1) 点击搜索栏输入文本

2)点击键盘上的完成,键盘将消失

3) 键盘退出后,x 仍保留在UISearchBar

4) 点击 x 中的 x 中UISearchBar的文本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];

对此的任何指导将不胜感激。我知道我错过了一个关键步骤,但我就是想不通。

4

3 回答 3

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];
}
于 2014-04-08T15:19:35.287 回答
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];
    }
}
于 2014-04-08T14:39:56.883 回答
0

为了清楚起见,我在这里创建了一个答案,但是 Michaels 的答案提供了很大帮助,并且是这里公认的方法,尽管我的代码可以正常工作。

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

但是,我也注意到,在我原来的问题的步骤中,键盘被关闭并且 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进入添加条目正在调用的视图中,我检查了 searchBar isFirstResponder,如果是,我resignFirstResponder

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

于 2014-04-08T16:56:07.837 回答