我的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];
对此的任何指导都将非常感激。我知道我错过了一个关键步骤,但我无法弄明白。
答案 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;你真的指出了我正确的方向来解决整个下午的问题!