我有一个简单的场景(使用IB中的故事板),带有用户名和密码文本框。当您在密码文本字段上时,我已将键盘设置为关闭但无法使用下一个(返回)按钮来处理用户名以将焦点(或第一响应者)切换到密码文本框。
我在密码文本字段上关闭键盘,如下所示:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
}
return YES;
}
我知道它与此类似,但无法确定它。
答案 0 :(得分:90)
默认情况下,返回键在文本字段中不会执行任何特殊操作。您需要明确更改第一响应者:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
} else if (theTextField == self.textUsername) {
[self.textPassword becomeFirstResponder];
}
return YES;
}
答案 1 :(得分:40)
我使用此代码可以控制 storyboard 中的表单行为:
-(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
和returnkey
。< / p>
答案 2 :(得分:11)
对于那些想要使用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
}
//...
}
: - )
答案 3 :(得分:9)
您必须在头文件中添加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;
}
答案 4 :(得分:5)
存在许多解决此问题的方法。请参阅此问题的回复:How to navigate through textfields (Next / Done Buttons)。
在UIResponder Class Reference中阅读更多内容。
答案 5 :(得分:3)
这是你要放的东西:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
} else if (theTextField == self.usernameField) {
[self.textPassword becomeFirstResponder];
}
return YES;
}
答案 6 :(得分:0)
您可以使用UITextfield的这个子类根据文本/字符串条件动态更改UIReturnKey,然后在textFieldShouldReturn中执行继续操作:(UITextField *)textField delegate
if (textField.returnKeyType == UIReturnKeyNext)
https://github.com/codeinteractiveapps/OBReturnKeyTextField
答案 7 :(得分:0)
我遇到了密码文本字段获得焦点然后立即失去焦点的问题。最后我发现我们最好在函数textFieldShouldReturn中返回NO。如果我们返回YES,则文本字段将获得insertText:call。然后它会失去焦点。不知道原因。
我为此问题创建了一个新问题:UITextField get focus and then lose focus immediately due to return YES in textFieldShouldReturn
如果有人知道原因,请告诉我。感谢。
- (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;
}
答案 8 :(得分:0)
这是Rob Mayoff的Swift 2.0版本
func textFieldShouldReturn(textField: UITextField) -> Bool {
if textField == self.emailTextField {
self.passwordTextField.becomeFirstResponder()
}else{
self.passwordTextField.resignFirstResponder()
}
return false
}
答案 9 :(得分:0)
快速版本可能是:
extension LoginViewController: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField == self.emailTextField {
passwordTextField.becomeFirstResponder()
} else if textField == self.passwordTextField {
passwordTextField.resignFirstResponder()
}
return true
}
}
答案 10 :(得分:-1)
我尝试使用Esteve的答案,但它不起作用。也许是因为我正在使用xib文件。我所做的就是改变他的代码,让它在我的代码中运行。
它以同样的方式工作。您只需将订单值指定为标记,然后根据每个输入控件上的Next或Done或Send返回键。
- (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;
}