20

我有UIViewController一个UISearchBar。我已将“搜索”按钮替换为“完成”按钮。

但是,当点击搜索栏时,完成按钮最初是disabled。这种情况会一直发生,直到一个人输入任何字符。

我想要做的是始终拥有这个完成按钮enabled,这样如果我点击它,我可以立即关闭键盘。

有什么帮助吗?将不胜感激。

我有我的UIViewController

-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar  
{   
    return YES;  
}  

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [searchBar resignFirstResponder];
}  

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText  
{  
    if (searchBar.text.length == 0)  
    {  
        //[self fixOrientation];  
        [searchBar resignFirstResponder];  
    }   
    else  
    {  
        NSLog(@"typed");  
    }  
}  


-(void)searchBarTextDidBeginEditing:(UISearchBar *)theSearchBar  
{  
    NSLog(@"began");  // this executes as soon as i tap on the searchbar, so I'm guessing this is the place to put whatever solution is available  
}  
4

10 回答 10

30

您可以通过循环 UISearchBar 中的子视图来解决此问题,直到找到文本字段。然后只需将“enablesReturnKeyAutomatically”设置为 NO。顺便说一下,下面的代码对于设置键盘类型也很有用。

  // loop around subviews of UISearchBar
  for (UIView *searchBarSubview in [searchBar subviews]) {    
    if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) {    
      @try {
        // set style of keyboard
        [(UITextField *)searchBarSubview setKeyboardAppearance:UIKeyboardAppearanceAlert];

        // always force return key to be enabled
        [(UITextField *)searchBarSubview setEnablesReturnKeyAutomatically:NO];
      }
      @catch (NSException * e) {        
        // ignore exception
      }
    }
  }
于 2011-04-05T13:49:15.807 回答
23

现在UISearchBar符合UITextInputTraits. 您可以简单地设置:

searchBar.enablesReturnKeyAutomatically = NO;

警告:虽然这是为 iOS 7.0 编译的,但它会在运行时崩溃。它仅适用于 >=7.1。

文档对此并不清楚,因为仅从 7.1 开始,UISearchBar实现了该UITextInputTraits协议,但没有说明该协议是从哪个 iOS 版本开始采用的。

于 2015-03-24T10:15:11.943 回答
10

接受的答案似乎不再起作用,所以我创建了自己的类别,似乎确实有效:

@implementation UISearchBar (enabler)

- (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 {
                // always force return key to be enabled
                [(UITextField *)searchBarSubview setEnablesReturnKeyAutomatically:NO];
            }
            @catch (NSException * e) {
                // ignore exception
            }
        }
    }
}
于 2013-09-17T16:33:30.303 回答
4

对于 iOS 8 及更高版本,您可以使用

[self.searchBar setReturnKeyType:UIReturnKeyDone];
[self.searchBar setEnablesReturnKeyAutomatically:NO];
于 2016-04-28T06:34:22.897 回答
4

XCode 8.3.3 上的 iOS 10 简单易用的解决方案,虽然花了一些时间才弄清楚:)

@IBOutlet var searchBar: UISearchBar! {
    didSet {
        searchBar.returnKeyType = .done
        searchBar.enablesReturnKeyAutomatically = false
    }
}

将搜索更改为完成。无需在搜索字段中键入任何内容即可启用完成。之后 -> searchBar.resignFirstResponder() 像这样:

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchBar.resignFirstResponder()
}
于 2017-08-01T22:08:04.367 回答
3

enableReturnKeyAutomatically设置为 false

自动启用ReturnKey

searchBar.enablesReturnKeyAutomatically = false
于 2018-09-13T20:32:30.130 回答
2

如果您有空字符串,此代码将显示搜索按钮:

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
    [itemSearchBar setShowsCancelButton:YES];
    UITextField *searchBarTextField = nil;
    for (UIView *subView in self.itemSearchBar.subviews)
    {
        for (UIView *sndSubView in subView.subviews)
        {
            if ([sndSubView isKindOfClass:[UITextField class]])
            {
                searchBarTextField = (UITextField *)sndSubView;
                break;
            }
        }
    }
    searchBarTextField.enablesReturnKeyAutomatically = NO;
    return YES;
}
于 2014-02-10T08:14:22.653 回答
0

例如,基于地图应用程序,似乎模式应该是在文本字段附近有一个取消按钮以摆脱键盘。话虽如此,一个建议可能是UIButton在那个角落放置一个看起来就像“完成”按钮的自定义。

一种hacky的解决方案......

希望这可以帮助!

于 2011-01-19T03:18:46.360 回答
0

一个最简单但很棘手的方法是在开始编辑搜索时将其留空

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
    //Add a blank character to hack search button enable
    searchBar.text = @" ";}
于 2013-05-27T11:12:12.387 回答
0

斯威夫特的扩展:

extension UISearchBar {
    var textField: UITextField? {
        return getTextField(inViews: subviews)
    }

    private func getTextField(inViews views: [UIView]?) -> UITextField? {
        guard let views = views else { return nil }

        for view in views {
            if let textField = (view as? UITextField) ?? getTextField(inViews: view.subviews) {
                return textField
            }
        }

        return nil
    }
}

用法:

searchBar.textField?.returnKeyType = .Done
searchBar.textField?.enablesReturnKeyAutomatically = false
于 2016-12-19T06:48:54.793 回答