iOS应用程序“下一个”键将不会转到下一个文本字段

我有一个简单的场景(在IB中使用情节提要),用户名和密码文本框。 当您处于“密码”文本字段时,我已将键盘设置为closures状态,但无法获取用于将用户名(或First Responder)切换到“密码”文本框的下一个(返回)button。

我正在closures密码文本字段,如下所示:

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

您只需要将订单值分配为tag ,然后根据每个input控件上的下一个完成将返回键

对于那些想使用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; } 

存在这个问题的许多解决scheme。 请参阅发布到此问题的回复: 如何浏览文本字段(下一个/完成button) 。

阅读更多的UIResponder类参考 。

这就是你会说的:

 - (BOOL)textFieldShouldReturn:(UITextField *)theTextField { if (theTextField == self.textPassword) { [theTextField resignFirstResponder]; } else if (theTextField == self.usernameField) { [self.textPassword becomeFirstResponder]; } return YES; } 

您可以使用UITextfield的这个子类根据文本/string条件dynamic更改UIReturnKey,然后在textFieldShouldReturn中执行您的继续操作:(UITextField *)textField delegate

 if (textField.returnKeyType == UIReturnKeyNext) https://github.com/codeinteractiveapps/OBReturnKeyTextField 

我得到了一个密码文本框焦点,然后立即失去焦点的问题。 最后我发现我们最好在函数textFieldShouldReturn返回NO。 如果我们返回YES,那么文本字段将得到一个insertText:call。 那么它将失去焦点。 不知道原因。

我为这个问题创build了一个新的问题: 由于在textFieldShouldReturn中返回YES,UITextField获得焦点并立即失去焦点

如果有人知道原因,请告诉我。 谢谢。

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

这里是Rob Mayoff的Swift 2.0版本

 func textFieldShouldReturn(textField: UITextField) -> Bool { if textField == self.emailTextField { self.passwordTextField.becomeFirstResponder() }else{ self.passwordTextField.resignFirstResponder() } return false } 

我试图用Esteve的答案,但它不起作用。 也许是因为我在使用xib文件。 我所做的是更改他的代码,使其在我的代码中工作。

它以相同的方式工作。 您只需将订单值分配为标签,然后根据每个input控件上的下一个或完成或发送返回键。

 - (BOOL)textFieldShouldReturn:(UITextField *)textField{ [textField resignFirstResponder]; if(textField.returnKeyType==UIReturnKeyNext) { UITextField *next = (UITextField *)[self.view viewWithTag:textField.tag+1]; [next becomeFirstResponder]; } else if (textField.returnKeyType==UIReturnKeySend) { //Do whatever you want with the last TextField } return YES; }