UISearchBarコントロールで、キーボードの検索キーのタイトルを[完了]に変更する方法はありますか?
10 に答える
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
}
}
}
少なくともiOS8の場合、単純に:
[self.searchBar setReturnKeyType:UIReturnKeyDone];
iOS 7ベータ5の時点では、Run Loopの答えは私には機能しませんでしたが、これは機能しました:
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];
}
}
}
}
もう1つの便利なヒントは、ループコードの実行(「@try」内)セクションです。
これにより、テキストフィールドが空の場合に[完了]ボタンが有効になります。
UITextField *tf = (UITextField *)searchBarSubview;
tf.enablesReturnKeyAutomatically = NO;
Swiftが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
}
ただのリマインダー!searchBarがファーストレスポンダーのままである場合は、returnKeyTypeを変更した後、キーボードを閉じて再度ポップアップし、変更を確認する必要があります。
search.resignFirstResponder()
searchBar.returnKeyType = UIReturnKeyType.Done
search.becomeFirstResponder()
これはオプションのメソッドを使用するプロトコルであるため、try-catchingではなく、各メソッドを個別にテストする必要があります。
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
。
Alertスタイルのキーボードは半透明なので、背後にある自分のビューを見ることができます。キーボードの後ろに複数の要素があり、キーが目立ちにくいため、見栄えがよくありません。真っ黒なキーボードが欲しかった。
そこで、テキストを編集するときに、黒いUIImageViewをキーボードの後ろの位置にアニメーション化しました。これにより、真っ黒なキーボードの外観が得られます。
- (void)textFieldDidBeginEditing:(UITextField *)textField {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.25];
blackBoxForKeyboard.frame = CGRectMake(0, 377, 320, 216);
[UIView commitAnimations];
}
ここに示されているすべてのソリューションを試しましたが、UISearchBar(iOS7用にコンパイルされたxcode5)では機能しませんでした。私は私のために働いたこの再帰関数に行き着きました:
- (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];
すべての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;
}
}