2012-04-17 24 views
29

iPhoneのリターンキーを編集中に変更する方法を教えてください。私はそれを持ち帰るし、キーボードを隠し[myTextField becomeFirstResponder];、その後[myTextField resignFirstResponder];を呼び出す場合は、これが唯一の作品について編集中にreturnKeyTypeを変更するにはどうすればよいですか?

myTextField.returnKeyType = UIReturnKeySearch; 

を知っています。さもなければ、それは私が前に持っていたものと同じようにとどまり、この場合は「行く」でした。ユーザーが入力する文字に応じて切り替えを続ける必要があります。


1行で:編集中のキーボードの戻りキーの種類を変更するにはどうすればよいですか?

答えて

47

[textField reloadInputViews]は私がreturnKeyTypeを公開するために、カスタムカテゴリを作っ

+0

明日試してみましょう。ありがとうございます –

+1

ビジネスをしますか?キーは物事を正しい順序で行うことです。 [myTextField becomeFirstResponder]; myTextField.returnKeyType = UIReturnKeyDone; [myTextField reloadInputViews]; –

+8

reloadInputViewsにはいくつかの警告があります。 http://stackoverflow.com/questions/5958427/can-i-change-property-uireturnkeytype-of-uitextfield-dynamicallyを参照してください。また、キーボードを元の状態に戻します。したがって、ユーザーが他のキーボードレイアウト(数字、句読点など)のいずれかに切り替えた場合、その状態は失われます。 –

0

あなたは、TextFieldのデリゲートを使用してみました:

- (BOOL)textFieldShouldBeginEditing:(UITextFieldの*)テキストフィールド { textField.returnKeyType = UIReturnKeySearchを。 return YES; }

+0

はい、それでもキーボードを閉じて開く必要があります。とにかく感謝しています。 –

6

私はそれをしばらく前に見つけましたが、ここに戻って忘れました。 は、私が使用しています:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: 
(NSRange)range replacementString:(NSString *)string { 
    [self performSelector:@selector(addressBarTextDidChange:) withObject:nil afterDelay:0.1]; 
    return YES; 
} 

-(void)addressBarTextDidChange:(NSString *)text { 
    NSString *addressText = @"..."; //Wherever you get your text from... 
    if ([addressText isEqualToString:@""]==NO) { 
     if ([addressText rangeOfString:@" "].location != NSNotFound) { 
      //[addressBarTextField setReturnKeyType:UIReturnKeySearch]; 
      if (addressBarTextField.returnKeyType!=UIReturnKeySearch) { 
       [UIView beginAnimations:nil context:NULL]; //Setup the animation. 
       [UIView setAnimationDuration:0.0]; //The duration for the animation. 
       [addressBarTextField resignFirstResponder]; 
       addressBarTextField.returnKeyType = UIReturnKeySearch; 
       [addressBarTextField becomeFirstResponder]; 
       [UIView commitAnimations]; 
      } 
     } else { 
      //[addressBarTextField setReturnKeyType:UIReturnKeyGo]; 
      if (addressBarTextField.returnKeyType!=UIReturnKeyGo) { 
       [UIView beginAnimations:nil context:NULL]; //Setup the animation. 
       [UIView setAnimationDuration:0.0]; //The duration for the animation. 
       [addressBarTextField resignFirstResponder]; 
       addressBarTextField.returnKeyType = UIReturnKeyGo; 
       [addressBarTextField becomeFirstResponder]; 
       [UIView commitAnimations]; 
      } 
     } 

    } else { 
     if (addressBarTextField.returnKeyType!=UIReturnKeyDone) { 
      [UIView beginAnimations:nil context:NULL]; //Setup the animation. 
      [UIView setAnimationDuration:0.0]; //The duration for the animation. 
      [addressBarTextField resignFirstResponder]; 
      addressBarTextField.returnKeyType = UIReturnKeyDone; 
      [addressBarTextField becomeFirstResponder]; 
      [UIView commitAnimations]; 
     } 
    } 
} 

を基本的に、私は(そう、ユーザはそれを見ることはありません)0.0秒の期間中と外のキーボードをアニメーション化しています。私はまた、キーボードが、私が切り替え前に必要なものではないかどうかをチェックしています。

+0

これは私のために働いた - ありがとう! – drudru

2

...トリックを行うようです。 self.addField.returnKeyType = UIReturnKeySearch;や、returnKeyTypeとして設定したいものをインポートして実行します。また、キーボードがすでに開いているときに動的に使用することもできます。自動的に更新されます。

ここでは、次のとおりです。

インタフェース:

/* 

Simple hack for exposing returnKeyType for UISearchBar without private APIs 
For you from CodeBuffet ;) 


Enjoy! 

~PW 

*/ 

#import <UIKit/UIKit.h> 

@interface UISearchBar (ReturnType) 

@property (nonatomic, readwrite) UIReturnKeyType returnKeyType; 

@end 

実装:それは次のようだった働いていたものを私の場合は

#import "UISearchBar+ReturnType.h" 

@implementation UISearchBar (ReturnType) 

UITextField *textField; 

- (UITextField *) traverseForTextViewInViews: (NSArray*) views 
{ 
    // Traverse over all views recursively until we find the tresure TextField hidden deep the UISearchBar ocean! 
    for(UIView *subView in views) { 
     if([subView conformsToProtocol:@protocol(UITextInputTraits)]) { 
      return (UITextField *) subView; 
     } 
     UITextField *tv = [self traverseForTextViewInViews:subView.subviews]; 
     if (tv) { 
      return tv; 
     } 
    } 
    return nil; 
} 

#pragma mark Custom Setters & Getters 

- (void)setReturnKeyType:(UIReturnKeyType)returnKeyType 
{ 
    if (!textField) { 
     textField = [self traverseForTextViewInViews:self.subviews]; 
    } 
    textField.returnKeyType = returnKeyType; 
    [self reloadInputViews]; 
    [textField reloadInputViews]; 
} 

- (UIReturnKeyType)returnKeyType 
{ 
    if (!textField) { 
     textField = [self traverseForTextViewInViews:self.subviews]; 
    } 
    return textField.returnKeyType; 
} 

@end 
+0

驚いたことに、これはまだiOS 9.3で動作します。あなたがする必要があるのは、UITextInputTraits(returnKeyTypeを設定するため)とUIResponder(reloadInputViewsを送信できるように)の両方を満たすサブビューを探すことです。 reloadInputViewsを 'self'に送る必要はありません。また、これをSwiftに書くことはできません。returnKeyType(オプションのプロパティ)を設定する方法はありません。少なくともObjective Cを使用する必要があります。ソリューションの中で最も素敵な部分は、キーボードが動かないことです。 –

+0

残念なことに、実験の後、私はデフォルトから次へと進むことができます - それはうまくいきます。しかし、ユーザーがテキストを削除してデフォルトに戻したい場合、「取る」ことはできません。それは「次へ」(少なくともシミュレータ上)にとどまります。一口。私は本当にこれがいつもうまくいくことを期待していました... –

+0

新しい問題 - そして本当に深刻な問題 - これを避けなければなりませんでした。 「ナンバーパッド」のキーボードを指定してこのトリックを使用すると、キーボードは「スタック」し、解消しません。少なくともキーボードの画像は残っています。一口。それで、古い「辞任」のテクニックに戻った。 –

4

sender.returnKeyType=UIReturnKeyNext; 
[sender reloadInputViews]; 
[sender resignFirstResponder]; 
[sender becomeFirstResponder]; 

私が持っていました力の上昇stResponderの後にbecomeFirstResponderが続きます。

+1

これにはパスワードフィールド(secureTextEntry)で欠陥があることに注意してください。 resignFirstResponder&becomeFirstResponderを呼び出すと、次のキーボードエントリが前のテキストに置き換わるようにフィールドがリセットされます(これはパスワードフィールドの標準的な動作と同じです)。 –

1

私は、コードのこれらの3行でそれをやった:

[sender setReturnKeyType:UIReturnKeyDone]; 
[sender resignFirstResponder]; 
[sender becomeFirstResponder]; 
+0

キーボードを外して再表示する必要があります。不可能ではありませんが面倒です。 –

1

私は(次< - >ゴー)returnKeyTypeを更新するために必要なテキストフィールドの現在の内容に基づきます。テキストフィールドのreloadInputViewsメソッドは、returnKeyTypeだけを設定しても機能しませんでした。他のポスターが述べたように、resignFirstResponderに続いてbecomeFirstResponderが必要でした。私の状況では、テキストフィールドがfirstResponderになってキーボードを表示すると、キーボードの解読と再表示がアニメーション化されます。小さなデバイスやランドスケープモードでは、テキストフィールドを含むビューも一時的にジャンプします。この望ましくない動作を隠すために私が見いだした解決策は、resignFirstResponderとbecomeFirstResponderを0秒間のアニメーションブロックに配置することです。あなたのUITextFieldUITextViewコールのreturnKeyTypeを変更した後

  [UIView animateWithDuration:0.0 
            delay:0.0 
           options:0 
          animations:^{ 
           [textField reloadInputViews]; 
           [textField resignFirstResponder]; 
           [textField becomeFirstResponder]; 
          } 
          completion:nil]; 
0

スウィフト3

textFieldOrView.resignFirstResponder() 
textFieldOrView.becomeFirstResponder() 

いくつかのケースでtextFieldOrView.reloadInputViews()作品を呼び出すが、それは上記の溶液と同様に安全ではありません。

関連する問題