2010-04-24 72 views

回答

96

對於命名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

它的工作原理。神奇的答案。非常感謝。 – 2010-04-25 22:52:29

+0

謝謝JK! – ambertch 2010-04-30 00:37:51

+0

這是否會超過App Store審批流程? – zekel 2010-06-17 00:26:41

0

由於警報式鍵盤是半透明的,我可以看到我的背後視圖。它看起來不太好,因爲我在鍵盤背後有多個元素,這使得鍵難以突出。我想要一個全黑鍵盤。

因此,當編輯文本時,我將黑色的UIImageView動畫到鍵盤後面的位置。這給出了全黑鍵盤的外觀。

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

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

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

} 
18

一個更有用的提示,向運行循環代碼(在 「@try」)部分。

這使「完成」按鈕,當文本字段爲空:

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

謝謝!這也適用於iOS7的Gregory解決方案。 – jbandi 2014-03-08 17:24:27

1

,因爲它與可選的方法的協議,你應該測試方法都單獨,而不是嘗試醒目的。

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

這將適用於iOS < = 6.對於iOS> = 7時,您需要循環中searchBar.subviews[0].subviews

43

由於iOS的7測試5,運行循環的回答並沒有爲我工作,但這並:

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

爲防萬一還不清楚,使用if/else的原因是if爲iOS 6向後兼容性,其他爲iOS 7. – 2013-09-18 14:13:23

+0

奇妙的答案。這適用於iOS 7.謝謝 – Katushai 2014-08-18 20:40:22

+0

這適用於iOS8 – 2015-03-31 17:05:44

0

我想這裏顯示的所有解決方案,和他們都不工作了我的UISearchBar(xcode5編譯iOS7)。我結束了這個遞歸函數,它爲我工作:

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

然後我把它稱爲像這樣:

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

使用Xcode 5 + iOS7,文本輸入將位於子子視圖中而不是子視圖中。所以基本上你使用我的Xcode 4解決方案並添加了遞歸調用。爲獲得最佳性能,您可以測試iOS版本,如果是iOS7,則可以瀏覽'subviews [0] .subviews'而不是'subviews'。 – 2014-01-15 13:21:46

41

至少爲iOS 8,簡單地說:

[self.searchBar setReturnKeyType:UIReturnKeyDone]; 
0

只是爲了涵蓋所有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

對於斯威夫特改變的UISearchBar

searchBar.returnKeyType = UIReturnKeyType.Done 
的返回鍵

可枚舉是如下

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

只是一個提醒!如果您將searchBar保留爲第一響應者,那麼在更改returnKeyType後,您需要關閉鍵盤並再次彈出以查看更改。

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