3

在 iOS 7 中,当用户清除以前在 UISearchBar 中的文本时,蓝色的“搜索”按钮将被禁用。有什么办法可以改变它,所以它总是启用的?我希望用户即使在没有文本的情况下也能够点击“搜索”,以显示列表中的所有项目,而不是按搜索词过滤它。(目前,当用户尝试清除以前的搜索词时,蓝色的“搜索”按钮会被禁用。)

我可以在我的委托的 searchBarTextDidEndEditing 回调中触发新的搜索,以便“关闭”键盘按钮会导致刷新列表中的所有结果......但理想情况下,即使字段中没有文本,我也希望蓝色的“搜索”按钮可用. 这可能吗?

4

2 回答 2

9

AppleUISearchBar在 iOS 7 中改变了结构。我找到了适用于 iOS 7 和以前 iOS 版本的组合解决方案。

- (void)searchBarTextDidBeginEditing:(UISearchBar *) bar
{
    UITextField *searchBarTextField = nil;
    NSArray *views = ([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0f) ? bar.subviews : [[bar.subviews objectAtIndex:0] subviews];
    for (UIView *subview in views)
    {
        if ([subview isKindOfClass:[UITextField class]])
        {
            searchBarTextField = (UITextField *)subview;
            break;
        }
    }
    searchBarTextField.enablesReturnKeyAutomatically = NO;
}
于 2013-10-24T13:14:30.507 回答
0

快速浏览标题后,看起来您想要完成的不是他们想要使用 UISearchBar 的内容。要准确获得您想要的内容,您可能需要使用没有所有搜索修饰的普通文本字段。

也就是说,我有一个最有效的技巧。它在不使用时用虚拟字符串填充搜索栏。当您输入第一个字符时,搜索按钮会在瞬间被禁用。但在大多数情况下,它会得到你想要的:

NSString *kDummyString = @" ";

@implementation CDViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.searchBar.searchBarStyle = UISearchBarStyleMinimal;
    self.searchBar.text = kDummyString;
}

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if (searchText.length < 1) {
        searchBar.text = kDummyString;
    }
}

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range     replacementText:(NSString *)text
{
    BOOL isPreviousTextDummyString = [searchBar.text isEqualToString:kDummyString];
    BOOL isNewTextDummyString = [text isEqualToString:kDummyString];
    if (isPreviousTextDummyString && !isNewTextDummyString && text.length > 0) {
        searchBar.text = @"";
    }

    return YES;
}

@end 
于 2013-10-23T02:45:53.183 回答