如何在 iOS 中为 UISearchBar 设置最近的搜索历史下拉列表

Posted

技术标签:

【中文标题】如何在 iOS 中为 UISearchBar 设置最近的搜索历史下拉列表【英文标题】:How to set a recent search history drop down for UISearchBar in iOS 【发布时间】:2015-10-24 10:04:12 【问题描述】:

我想为 UISearchbar 设置最近的搜索历史下拉列表。我已经使用UITableView 以编程方式实现了一个下拉列表

逻辑: 我的实现方式是在UISearchBar 正下方设置一个UITableView,然后单击UISearchBar,它将弹出。 我最初将那个 tableview 隐藏在 viewdidload -(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar 中,我正在取消隐藏 tableview 。 我面临着太多的问题:

1.searchbartext 为空时,返回按钮不可用。在这种情况下,如果我必须再次取消/隐藏表格视图,我必须依赖tapgestures

2. 再次点击searchbartext 不会触发它的任何代表。它触发代表点击searchbartext的唯一一次是第一次点击它然后它调用-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar

你们还有其他解决方案/方法可以比这更好的方式实现此功能吗? 我们有任何定制的UISearchBar 最近历史下拉列表吗?? 我已经在cocoacontrolscode4appcocoapods 中搜索了一个自定义的UISearchBar 最近历史下拉列表,因为没有希望找到任何。 请帮我解决这个问题。

【问题讨论】:

【参考方案1】:

对于您的第一个问题,您可以在UISearchBar 上添加一个类似这样的类别,当点击UISearchBar 时,这将始终启用键盘上的return 按钮

@implementation UISearchBar (MyAddition)


- (void)alwaysEnableSearch 
    // Loop around subviews of UISearchBar
    NSMutableSet *viewsToCheck = [NSMutableSet setWithArray:[self subviews]];

    while ([viewsToCheck count] > 0) 
        UIView *searchBarSubview = [viewsToCheck anyObject];
        [viewsToCheck addObjectsFromArray:searchBarSubview.subviews];
        [viewsToCheck removeObject:searchBarSubview];

    if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) 
        @try 
            // Force return key to be enabled
            [(UITextField *)searchBarSubview setEnablesReturnKeyAutomatically:NO];
        
        @catch (NSException *iException) 

        
    
  

对于第二期,为什么不使用shouldChangeTextInRange: 委托方法,该方法会为每个输入的字符调用。

附带说明,this SO thread 有一个示例代码来执行此操作。这可能会对您有所帮助。

祝你好运!

【讨论】:

谢谢 :) 对于第二个问题,我想解决的方法是当 searchbartextfield 为空并且我第二次单击 searchbartextfield 时要关闭 tableview 。这就是为什么不使用 shouldChangeTextInRange 委托方法的原因。 我明白了。你试过touchesBegan: 方法吗?当你触摸搜索栏时它应该被调用,因为它的超类是UIResponder。另外,我认为这个答案值得一票:)! :-) 谢谢。让我知道您是否能够使用touchesBegan: 解决这个问题。如果没有,我很乐意花时间帮助你。【参考方案2】:

根据您最近的说明,我正在重写可能的步骤。

    保留一个标志/布尔值来监控tableview是否隐藏。 在 UISearchBar Delegate 方法中检查 serachbar 的文本字段的 [obj isFirstResponder] 方法。 一种。如果 firstResponder =yes --> 显示历史表视图或反之亦然。显示/隐藏完成后,在 UISearchBar 的文本字段上调用下面的方法。 *[searchbarobj.textfield resignFirstResponder];* 湾。如果 firstResponder = No---> 什么也不做。离开方法。

【讨论】:

我可以给你解释一下这个场景。假设我单击了 searchbartextfield 它将触发代表,但再次单击 searchbartextfield 不会触发代表。那是我的问题。 您想在点击搜索栏时显示/隐藏表格视图..对吗? 是的。我想用键盘中的返回键实现相同的功能,但遗憾的是,当 UISearchBar 中没有文本输入时,返回键被禁用。

以上是关于如何在 iOS 中为 UISearchBar 设置最近的搜索历史下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

iOS之让UISearchBar搜索图标和placeholder靠左显示

更改 UISearchBar 的条形颜色 - iOS

如何在 iOS 10 的目标 c 中使用 uisearchbar?

如何在 iOS7 中右对齐 UISearchbar 的文本

如何在iOS上更改UISearchBar组件的内部背景颜色

如何在iOS 7中更改文本UISearchBar的取消按钮颜色?