【发布时间】:2014-05-21 03:19:44
【问题描述】:
我有一个UITableView,顶部有一个UISearchBar,并且有一个不起作用的特定要求。
我的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 语句根本没有做任何事情,并且导航栏项目仍然被禁用。
我什至在那个 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];
对此的任何指导将不胜感激。我知道我错过了一个关键步骤,但我就是想不通。
【问题讨论】:
-
你在哪里设置
addButton.enabled = NO? -
嗨,Michael,在 searchBarShouldBeginEditing 和 searchBarSearchButtonClicked 中使用 if ([self.timelineSearchBar.text length] > 0) 语句,否则在此委托方法中再次启用按钮。没有其他地方设置为 NO
标签: ios selector uisearchbar uisearchbardelegate