iOS应用" next"密钥不会转到下一个文本字段

时间:2012-03-02 21:17:55

标签: iphone objective-c ios xcode first-responder

我有一个简单的场景(使用IB中的故事板),带有用户名和密码文本框。当您在密码文本字段上时,我已将键盘设置为关闭但无法使用下一个(返回)按钮来处理用户名以将焦点(或第一响应者)切换到密码文本框。

我在密码文本字段上关闭键盘,如下所示:

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

我知道它与此类似,但无法确定它。

11 个答案:

答案 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;
} 

您只需根据每个输入控件上的下一步完成将订单值指定为tagreturnkey。< / 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;
}