我有一个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];
对此的任何指导将不胜感激。我知道我错过了一个关键步骤,但我就是想不通。