web-dev-qa-db-fra.com

Modifier le titre du bouton de recherche UISearchBar/Keyboard

Dans le contrôle UISearchBar, est-il un moyen de changer le titre de la clé de recherche du clavier en Fait?

54
Jim B

Pour une barre de recherche nommée table searchbar:

// Set the return key and keyboard appearance of the search bar
        for (UIView *searchBarSubview in [tableSearchBar subviews]) {

            if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) {

                @try {

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

                    // ignore exception
                }
            }
        }
97
RunLoop

Au moins pour iOS 8, simplement:

    [self.searchBar setReturnKeyType:UIReturnKeyDone];
48
pickwick

Depuis iOS 7 beta 5, la réponse de Run Loop ne fonctionnait pas pour moi, mais cela fonctionnait:

for(UIView *subView in [searchBar subviews]) {
    if([subView conformsToProtocol:@protocol(UITextInputTraits)]) {
         [(UITextField *)subView setReturnKeyType: UIReturnKeyDone];
    } else {
        for(UIView *subSubView in [subView subviews]) {
            if([subSubView conformsToProtocol:@protocol(UITextInputTraits)]) {
                [(UITextField *)subSubView setReturnKeyType: UIReturnKeyDone];
            }
        }      
    }
}
43
Gregory Cosmo Haun

Un autre conseil utile, à la section Run Loop code (in "@try").

Ce bouton "Terminé" est activé lorsque le champ de texte est vide:

UITextField *tf = (UITextField *)searchBarSubview;
tf.enablesReturnKeyAutomatically = NO;
18
theWalker

Pour que Swift modifie la clé de retour de UISearchBar

searchBar.returnKeyType = UIReturnKeyType.done

Enum disponibles sont comme ci-dessous

public enum UIReturnKeyType : Int {

    case default
    case go
    case google
    case join
    case next
    case route
    case search
    case send
    case yahoo
    case done
    case emergencyCall
    @available(iOS 9.0, *)
    case continue
}
11
Hardik Thakkar

Juste un rappel! Si votre barre de recherche reste en tant que premier répondeur, après avoir modifié votre returnKeyType, vous devez fermer votre clavier et le redécouvrir pour voir les modifications. 

search.resignFirstResponder()
searchBar.returnKeyType = UIReturnKeyType.Done
search.becomeFirstResponder()
2
Codingpan

Comme il s'agit d'un protocole avec des méthodes facultatives, vous devez tester chaque méthode séparément au lieu d'essayer de capturer.

for (UIView *searchBarSubview in searchBar.subviews)
{
    if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)])
    {
        // keyboard appearance
        if ([searchBarSubview respondsToSelector:@selector(setKeyboardAppearance:)])
            [(id<UITextInputTraits>)searchBarSubview setKeyboardAppearance:UIKeyboardAppearanceAlert];
        // return key 
        if ([searchBarSubview respondsToSelector:@selector(setReturnKeyType:)])
            [(id<UITextInputTraits>)searchBarSubview setReturnKeyType:UIReturnKeyDone];
        // return key disabled when empty text
        if ([searchBarSubview respondsToSelector:@selector(setEnablesReturnKeyAutomatically:)])
            [(id<UITextInputTraits>)searchBarSubview setEnablesReturnKeyAutomatically:NO];
        // breaking the loop when we are done
        break;
    }
}

Cela fonctionnera pour iOS <= 6. Pour iOS> = 7, vous devez boucler searchBar.subviews[0].subviews.

1
Cœur

Juste pour couvrir toutes les versions d'iOS:

NSArray *subviews = [[[UIDevice currentDevice] systemVersion] floatValue] < 7 ? _searchBar.subviews : _searchBar.subviews[0].subviews;

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

Comme les claviers de style Alert sont semi-transparents, je peux voir ma vue derrière. Cela ne semble pas très beau car j'ai plusieurs éléments derrière le clavier, ce qui empêche les touches de se démarquer. Je voulais un clavier tout noir.

J'ai donc animé un UIImageView noir en position derrière le clavier lorsque le texte est édité. Cela donne l’apparence d’un clavier entièrement noir.

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.25]; 

    blackBoxForKeyboard.frame = CGRectMake(0, 377, 320, 216);
    [UIView commitAnimations]; 

}
0
RyeMAC3

J'ai essayé toutes les solutions présentées ici et aucune d'entre elles n'a fonctionné pour mon UISearchBar (compilation xcode5 pour iOS7). J'ai fini avec cette fonction récursive qui a fonctionné pour moi:

- (void)fixSearchBarKeyboard:(UIView*)searchBarOrSubView {

    if([searchBarOrSubView conformsToProtocol:@protocol(UITextInputTraits)]) {
        if ([searchBarOrSubView respondsToSelector:@selector(setKeyboardAppearance:)])
            [(id<UITextInputTraits>)searchBarOrSubView setKeyboardAppearance:UIKeyboardAppearanceAlert];
        if ([searchBarOrSubView respondsToSelector:@selector(setReturnKeyType:)])
            [(id<UITextInputTraits>)searchBarOrSubView setReturnKeyType:UIReturnKeyDone];
        if ([searchBarOrSubView respondsToSelector:@selector(setEnablesReturnKeyAutomatically:)])
            [(id<UITextInputTraits>)searchBarOrSubView setEnablesReturnKeyAutomatically:NO];
    }

    for(UIView *subView in [searchBarOrSubView subviews]) {
        [self fixSearchBarKeyboard:subView];
    }
}

Je l'ai alors appelé comme suit:

_searchBar = [[UISearchBar alloc] init];
[self fixSearchBarKeyboard:_searchBar];
0
dacoinminster