Dans le contrôle UISearchBar, est-il un moyen de changer le titre de la clé de recherche du clavier en Fait?
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
}
}
}
Au moins pour iOS 8, simplement:
[self.searchBar setReturnKeyType:UIReturnKeyDone];
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];
}
}
}
}
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;
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
}
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()
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
.
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;
}
}
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];
}
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];