2010-04-24 12 views

Odpowiedz

96

Dla searchbar nazwie 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

To działa. Fantastyczna odpowiedź. Wielkie dzięki. –

+0

Dzięki JK!Pomógł mi również – ambertch

+0

Czy minie proces zatwierdzania App Store? – zekel

0

Od klawiatur Alert stylu są półprzezroczyste, widzę mój pogląd za nim. Nie wygląda to zbyt dobrze, ponieważ mam za klawiaturą wiele elementów, które utrudniają wyróżnianie się klawiszy. Chciałem mieć całkowicie czarną klawiaturę.

Tak więc animowałem czarny UIImageView na miejsce za klawiaturą, gdy tekst jest edytowany. Daje to wygląd całkowicie czarnej klawiatury.

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

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

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

} 
18

Jednym z bardziej przydatna wskazówka, do Run Loop kodu (w "@try") sekcji.

Umożliwiło „Gotowe” przycisk, gdy pole tekstowe jest puste:

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

Dzięki! Działa to również z rozwiązaniem Gregory dla iOS7. – jbandi

1

Ponieważ jest to protokół z metod opcjonalnych, należy przetestować każdą metodę oddzielnie zamiast próbować wzrok.

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

To będzie pracować dla iOS < = 6. Dla iOS> = 7, trzeba pętli w searchBar.subviews[0].subviews.

43

Jako iOS 7 Beta 5, odpowiedź Run Loop nie dla mnie, ale to zrobił:

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

Na wypadek, gdyby nie było to jasne, powodem, dla którego użyje się/else, jest zgodność z poprzednią zgodnością iOS 6, natomiast w przypadku iOS 7. –

+0

fantastyczna odpowiedź. to działa na iOS 7. dziękuję – Katushai

+0

Działa to w iOS8 –

0

Próbowałem wszystkich rozwiązań pokazanych tutaj, a żaden z nich nie pracował dla mojego UISearchBar (xcode5 kompilacja dla iOS7). Skończyło się tym funkcji rekurencyjnej, który pracował dla mnie:

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

I wtedy nazwał ją tak:

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

W Xcode 5 + iOS7, wprowadzanie tekstu będzie w podsprawie, a nie w widoku podrzędnym. Zasadniczo skorzystałeś z mojego rozwiązania Xcode 4 i dodałeś wywołanie rekurencyjne. Aby uzyskać najlepsze wyniki, możesz przetestować wersję dla systemu iOS, a jeśli jest to iOS7, przejrzyj "subviews [0] .subviews" zamiast "subviews". –

41

Przynajmniej dla iOS 8, prosto:

[self.searchBar setReturnKeyType:UIReturnKeyDone]; 
0

Tylko obejmujące wszystkie wersje 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

Dla Swift zmienić klucz powrotny UISearchBar

searchBar.returnKeyType = UIReturnKeyType.Done 

enum dostępne są poniżej

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

tylko przypomnienie! Jeśli przeszukiwarkaBar pozostaje pierwszą odpowiedzią, po zmianie metody returnKeyType należy zamknąć klawiaturę i ponownie ją wyświetlić, aby wyświetlić zmiany.

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