2010-04-24 13 views

risposta

96

Per una barra di ricerca di nome tablesearchbar:

// 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 
       } 
      } 
     } 
+0

Funziona. Risposta fantastica Grazie molto. –

+0

Grazie JK!Mi ha aiutato anche – ambertch

+0

Questo supererà la procedura di approvazione di App Store? – zekel

0

Dal momento che le tastiere in stile Alert sono semi-trasparenti, posso vedere mio punto di vista dietro di esso. Non sembra molto bello dato che ho molti elementi dietro la tastiera che rendono difficile la distinzione dei tasti. Volevo una tastiera completamente nera.

Così ho animato un UIImageView nero in posizione dietro la tastiera quando si modifica il testo. Questo dà l'aspetto di una tastiera completamente nera.

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

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

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

} 
18

più Un suggerimento utile, al Run Loop codice (in "@try") sezione.

Ciò ha permesso il pulsante "Done" quando il campo di testo è vuoto:

UITextField *tf = (UITextField *)searchBarSubview; 
tf.enablesReturnKeyAutomatically = NO; 
+1

Grazie! Funziona anche con la soluzione di Gregory per iOS7. – jbandi

1

Come è un protocollo con metodi opzionali, è necessario verificare ogni metodo separatamente invece di cercare l'attenzione.

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; 
    } 
} 

Questo funziona per iOS < = 6. Per iOS> = 7, è necessario loop in searchBar.subviews[0].subviews.

43

Come di iOS 7 beta 5, la risposta di Run Loop non ha funzionato per me, ma questo ha fatto:

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]; 
      } 
     }  
    } 
} 
+5

Nel caso in cui non sia chiaro, il motivo se/else viene utilizzato è il if per iOS 6 compatibilità con le versioni precedenti e il resto è per iOS 7. –

+0

risposta fantastica. questo funziona su iOS 7. grazie – Katushai

+0

Funziona su iOS8 –

0

ho provato tutte le soluzioni illustrate qui, e nessuno di loro ha lavorato per la mia UISearchBar (xcode5 compilazione per iOS7). Ho finito con questa funzione ricorsiva che ha funzionato per me:

- (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]; 
    } 
} 

Poi ho chiamato in questo modo:

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

Con Xcode 5 + iOS7, l'immissione di testo sarà in una sottoview anziché in una sottoview. Quindi in pratica hai usato la mia soluzione Xcode 4 e ho aggiunto una chiamata ricorsiva. Per le migliori prestazioni, puoi provare per la versione iOS e, se si tratta di iOS7, puoi navigare attraverso 'sottoview [0] .subviews' invece di' subviews'. –

41

Almeno per iOS 8, semplicemente:

[self.searchBar setReturnKeyType:UIReturnKeyDone]; 
0

Solo per che copre tutte le versioni 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; 
    } 
} 
9

Per Swift per cambiare tasto di ritorno di UISearchBar

searchBar.returnKeyType = UIReturnKeyType.Done 

enum disponibili sono le seguenti

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 
} 
1

Solo un promemoria! Se searchBar rimane come primo risponditore, dopo aver modificato returnKeyType, devi chiudere la tastiera e farlo scattare di nuovo per vedere le modifiche.

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