2014-04-08 49 views
2

我有在顶部的UISearchBar一个UITableView,并有不工作的特定要求执行上的UISearchBar行动。当键盘下跌,而x被窃听

我的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语句:

[self.timelineSearchBar performSelector:@selector(enableAdd) 
        withObject:nil 
        afterDelay:0]; 

- (void)enableAdd 
{ 
    self.addButton.enabled = YES; 
} 

但崩溃说搜索栏不给enableAdd选择作出回应。

我已经完成了一个断点,并且看到上面的if语句在我点击x并进入语句时确实计算为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/链接 - 文本字段的shouldClear方法不会被调用。我正在使用iOS 7,所以也许有另一种方法来嵌入与textFields的意见?这很可能是正确的方法,但它不能与我的代码一起工作,因为该示例中的for语句永远不会被评估为真(我放入NSLog中)。

更新2:如果从if语句上面,我叫searchBarCancelButton方法,我只好所引起极端的循环,所以那当然是不正确的做法:

[self performSelector:@selector(searchBarCancelButtonClicked:) withObject:self.timelineSearchBar afterDelay: 0]; 

对此有何指导会真的很感激。我知道我错过了一个关键步骤,但我无法弄清楚。

+0

你在哪里设置'addButton.enabled = NO'? – michaels

+0

嗨迈克尔,在searchBarShouldBeginEditing和searchBarSearchButtonClicked与一个if([self.timelineSearchBar.text长度]> 0)语句,else在此委托方法中再次启用按钮。没有其他地方被设置为NO – amitsbajaj

回答

3

的问题是,轻敲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]; 
} 
+0

非常感谢@ michael - 我真的很感谢你的想法,并与此合作。我已经回答了这个问题,并清楚说明了我所做的工作,但是如果没有您的意见,我永远也不会有这样的问题,并且我几乎可以让您的代码正常工作;只是稍微调整了一下。再次感谢您的帮助,并且非常乐意通过我必须使用的方法来获得您的想法 – amitsbajaj

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]; 
    } 
} 
+0

谢谢@Goutham - 这是有帮助的,但不幸的是它的结果是一样的。我看到的是,键盘上(isFirstResponder),如果我点击取消按钮,然后键盘辞职和导航栏按钮(addButton)变得启用。但是,在键盘已经resignFirstResponder的情况下,UISearchBar中的x不会启用导航栏按钮项目。我想知道这是否是iOS中的一个错误。 – amitsbajaj

0

我在这里创造一个答案清晰,但迈克尔的回答大量帮助,是公认的做法在这里,虽然我得到了我的代码工作。

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

但是,我也注意到,在我原来的问题的步骤,驳回了键盘和包含文本和X可见的UISearchBar,如果我拍了拍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取消后,又回到了搜索栏的代码反应适当。

这样,只要我点击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;你真的指出我正确的方向来解决整个下午的问题!

+0

很高兴看到您的工作成果!我非常怀疑你会因为这个原因而拒绝你的应用程序,因为你没有使用任何私有API或做任何危险的事情(在我看来)。我很惊讶,你看到'shouldBeginEditing'在'textDidChange'之前被调用 - 我在我的方面有相反的结果,但是,嘿,如果它工作的话,它就行! – michaels

+0

绝对!令人困惑,但它工作,我很高兴:)再次感谢迈克尔 - 真的很感激它! – amitsbajaj