ユーザー名とパスワードのテキストボックスがある単純なシーン(IBのストーリーボードを使用)があります。パスワードテキストフィールドを開いているときにキーボードを閉じるように設定しましたが、パスワードテキストボックスにフォーカス(またはファーストレスポンダー)を切り替えるユーザー名で次へ(戻る)ボタンを使用することはできません。
次のように、[パスワード]テキストフィールドでキーボードを閉じています。
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
}
return YES;
}
私はそれがこれに似たものであることを知っていますが、それを特定することはできません。
デフォルトでは、リターンキーはテキストフィールドで特別なことはしません。最初のレスポンダーを明示的に変更する必要があります。
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
} else if (theTextField == self.textUsername) {
[self.textPassword becomeFirstResponder];
}
return YES;
}
ストーリーボードでフォームの動作を制御できるこのコードを使用します。
-(BOOL) textFieldShouldReturn:(UITextField *)textField{
if(textField.returnKeyType==UIReturnKeyNext) {
UIView *next = [[textField superview] viewWithTag:textField.tag+1];
[next becomeFirstResponder];
} else if (textField.returnKeyType==UIReturnKeyDone) {
[textField resignFirstResponder];
}
return YES;
}
必要なのは、各入力コントロールでNextまたはDoneに従ってtag
およびreturnkey
として順序値を割り当てることです。
Swift言語:
class MyClass: UIViewController, UITextFieldDelegate {
@IBOutlet weak var text1: UITextField!
@IBOutlet weak var text2: UITextField!
@IBOutlet weak var text3: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
text1.delegate = self
text2.delegate = self
text3.delegate = self
}
//....
func textFieldShouldReturn(textField: UITextField) -> Bool{
if textField == self.text1 {
self.text2.becomeFirstResponder()
}else if textField == self.text2{
self.text3.becomeFirstResponder()
}else{
self.text1.becomeFirstResponder()
}
return true
}
//...
}
:-)
ヘッダーファイルにUITextFieldDelegateを追加する必要があります。次に、設定する必要があります
theTextField.delegate = self;
viewDidLoadメソッドで。その後、あなたは続けることができます
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
} else if (theTextField == self.textUsername) {
[self.textPassword becomeFirstResponder];
}
return YES;
}
この問題に対する多くの解決策が存在します。この質問に投稿された回答を参照してください: テキストフィールドをナビゲートする方法(次へ/完了ボタン) 。
詳細は IResponderクラスリファレンス をご覧ください。
ここにあなたが置くものがあります:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
} else if (theTextField == self.usernameField) {
[self.textPassword becomeFirstResponder];
}
return YES;
}
Swift 2.0 Rob Mayoffのバージョン
func textFieldShouldReturn(textField: UITextField) -> Bool {
if textField == self.emailTextField {
self.passwordTextField.becomeFirstResponder()
}else{
self.passwordTextField.resignFirstResponder()
}
return false
}
パスワードのテキストフィールドがフォーカスを取得し、すぐにフォーカスを失うという問題が発生しました。最後に、関数textFieldShouldReturn:でNOを返す方がよいことがわかりました。 YESを返すと、テキストフィールドはinsertText:呼び出しを取得します。その後、フォーカスが失われます。理由がわからない。
この問題に対して新しい質問を作成しました: UITextFieldはフォーカスを取得し、textFieldShouldReturn でYESを返すため、すぐにフォーカスを失います
誰かが理由を知っているなら、私に知らせてください。ありがとう。
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
} else if (theTextField == self.textUsername) {
[self.textPassword becomeFirstResponder];
}
// we'd better return NO here
return NO;
}
Text/string条件に従ってUIReturnKeyを動的に変更するUITextfieldのこのサブクラスを使用して、textFieldShouldReturn:(UITextField *)textFieldデリゲートで継続アクションを実行できます。
if (textField.returnKeyType == UIReturnKeyNext)
https://github.com/codeinteractiveapps/OBReturnKeyTextField