UISearchBar键盘返回键

时间:2011-12-20 23:48:23

标签: iphone ios

我正在使用UISearchBar将文本输入与数据库中的条目进行匹配,并在UITableView中将匹配的结果显示给用户。

一切都很好,但是,我找不到改变搜索栏键盘返回键类型的方法。默认情况下,它使用 Search 按钮替换标准 return 键。因为我在用户输入时进行实时搜索,所以我不需要这个按钮并将其设置为非活动状态会引发一些可用性问题。

尝试解决方案

  1. 我可以使用setKeyboard:UIKeyboardType方法设置键盘,但是这似乎没有覆盖用搜索 key,它不允许访问更改此 return 键。

  2. 我考虑过使用UITextField,让我通过returnKeyType协议访问UITextInputTraits属性。我的问题是,我正在实施UISearchBarDelegate方法searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText,我将失去UITextField

  3. 有没有办法让我可以保留搜索栏的委托方法的功能,同时合法访问键盘的返回键?

    事实上,我正在实施的几乎所有屏幕都可以在Apple的Clock应用程序中找到 截图:
    enter image description here

    因此,非常感谢任何有关清洁解决方案的帮助。请注意右下方的 return 键,而不是默认的搜索按钮。

9 个答案:

答案 0 :(得分:20)

与@sudip的答案相比,iOS 7略有不同。

for (UIView *subview in self.searchBar.subviews)
{
    for (UIView *subSubview in subview.subviews)
    {
        if ([subSubview conformsToProtocol:@protocol(UITextInputTraits)])
        {
            UITextField *textField = (UITextField *)subSubview;
            [textField setKeyboardAppearance: UIKeyboardAppearanceAlert];
            textField.returnKeyType = UIReturnKeyDone;
            break;
        }
    }
}

答案 1 :(得分:20)

我在没有运气的情况下尝试了所有这些解决方案,直到我意识到在IOS 8中,您可以设置searchBar.returnKey = .Done或您喜欢的任何UIReturnKeyType。符号

答案 2 :(得分:10)

试试这个:

for(UIView *subView in searchBar.subviews) {
    if([subView conformsToProtocol:@protocol(UITextInputTraits)]) {
        [(UITextField *)subView setKeyboardAppearance: UIKeyboardAppearanceAlert];
    }
}

如果要关闭返回键(即,使其无效),请将UITextField子视图中的“returnKeyType”属性设置为“UIReturnKeyDone”以及“keyboardAppearence”。

答案 3 :(得分:2)

我不得不在Neo的回答中添加一些内容。这是我为UISearchbar添加“完成”按钮的代码:

for(UIView *subView in sb_manSearch.subviews) {
    if([subView conformsToProtocol:@protocol(UITextInputTraits)]) {

        UITextField *t = (UITextField *)subView;
        [t setKeyboardAppearance: UIKeyboardAppearanceAlert];

        t.returnKeyType = UIReturnKeyDone;
        t.delegate = self;
        break;
    }
}

答案 4 :(得分:0)

你可以通过以下方式完成:

- (void)viewDidLoad 
{
     // Adding observer that will tell you keyboard is appeared.
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) 
                                                 name:UIKeyboardDidShowNotification object:nil];        

    [super viewDidLoad];
}

- (void)keyboardDidShow:(NSNotification *)note 
{
    keyboardTest = [self getKeyboard];

    [keyboardTest setReturnKeyEnabled: YES];
}

- (id) getKeyboard  // Method that returns appeared keyboard's reference 
{
    id keyboardView;

    // locate keyboard view
    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    UIView* keyboard;

    for(int i=0; i<[tempWindow.subviews count]; i++) 
    {
        keyboard = [tempWindow.subviews objectAtIndex:i];

        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) 
        {           
            if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)
            {
                keyboard = [[keyboard subviews] objectAtIndex:0];
                keyboardView = keyboard ;
            }
        } 
        else
        {
            if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
                keyboardView = keyboard ;
        }

    }
    return keyboardView ;
}

答案 5 :(得分:0)

更新:从iOS 7开始, 接受的答案将无效 ,以下版本将在iOS 7以上开始工作。

 UIView *subViews =  [[_searchBar subviews] firstObject];
        for(UIView *subView in [subViews subviews]) {
            if([subView conformsToProtocol:@protocol(UITextInputTraits)]) {
                [(UITextField *)subView setEnablesReturnKeyAutomatically:NO];
            }
        }

答案 6 :(得分:0)

for (UIView *subView in view.subviews) {
    if ([subView isKindOfClass:[UITextField class]])
    {
        UITextField *txt = (UITextField *)subView;

        @try {

            [txt setReturnKeyType:UIReturnKeyDone];
            [txt setKeyboardAppearance:UIKeyboardAppearanceAlert];
        }
        @catch (NSException * e) {

            // ignore exception
        }
    }
}

答案 7 :(得分:0)

将搜索更改为完成文字。 使用以下代码。

youtSearchBar.returnKeyType = .done

答案 8 :(得分:-1)

我刚刚发现了最简单的等待,只需在开始编辑搜索字段时填空

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
    //Add a blank character to hack search button enable
    searchBar.text = @" ";}