点击"下一步"时移动到下一个UITextField

Pau*_*ris 36 xcode objective-c uitextfield ipad ios4

我有一个iPad应用程序,里面有一个注册表单.表单非常基本,只包含两个UITextField,用于名称和电子邮件地址.

第一个TextField用于候选名称,当他们输入他们的名字并按键盘上的'Next'时,我希望它自动移动到下一个电子邮件地址TextField进行编辑.

知道我怎么能设置键盘的下一个按钮跳转到下一个键盘?

谢谢

law*_*cko 76

您需要将视图控制器设置为UITextField委托,并实现UITextField委托方法:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if (textField == nameField) {
        [textField resignFirstResponder];
        [emailField becomeFirstResponder];
    } else if (textField == emailField) {
        // here you can define what happens
        // when user presses return on the email field
    }
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

Swift版本:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField == nameField {
        textField.resignFirstResponder()
        emailField.becomeFirstResponder()
    } else if textField == emailField {
        // here you can define what happens
        // when user presses return on the email field
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)

您可能还希望滚动视图以使emailField可见.如果您的视图控制器是UITableViewController的一个实例,这应该会自动发生.如果没有,您应该阅读此Apple文档,尤其是移动位于键盘部分下方的内容.

  • @lawicko上面代码中的语句`[textField resignFirstResponder];`并不重要.虽然表单中还有字段,但只需将`becomeFirstResponder`移动到下一个字段:`[emailField becomeFirstResponder];` (6认同)

Pau*_*l.s 10

除了@lawicko的回答之外,我经常更改按钮文本以给出最后的画龙点睛(例如,next当有更多字段时,然后说到done最后一次):

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    BOOL isLastTextField = //.. your logic to figure out if the current text field is the last

    if (isLastTextField) {
        textField.returnKeyType = UIReturnKeyDone;
    } else {
        textField.returnKeyType = UIReturnKeyNext;
    }
}
Run Code Online (Sandbox Code Playgroud)


Wil*_* T. 10

Swift版的正确答案.

根据我的经验,切换textFields时不需要resignFirstResponder.

在这个例子中,它只是你的基本用户名和密码textFields.

用户名的故事板中的键盘"返回键"设置为"下一步",密码设置为"完成".

在此输入图像描述

然后只需连接这两个文本字段的代理并添加此扩展,您就完成了.

extension LoginViewController: UITextFieldDelegate {

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        if textField == textFieldPassword {
            self.view.endEditing(true)
        } else {
            textFieldPassword.becomeFirstResponder()
        }
        return true
    }

}
Run Code Online (Sandbox Code Playgroud)


moh*_*945 5

更一致和更健壮的方法是使用NextResponderTextField 您可以完全从界面构建器配置它.

你需要做的就是

  1. 设置类类型的的UITextFieldNextResponderTextField 在此输入图像描述
  2. 然后设置nextResponderField指向下一个响应者的出口,它可以是UITextField任何子UIResponder类或任何子类.它也可以是一个UIButton,并且该库足够智能,TouchUpInside只有在启用时才触发按钮事件. 在此输入图像描述 在此输入图像描述

这是图书馆的行动:

在此输入图像描述


Jon*_*era 5

夫特4扩展。只需传递 的数组,UITextFields它就会将每个连接到下一个,直到最后一个退出第一响应者(隐藏键盘):

extension UITextField {

    class func connectFields(fields: [UITextField]) {
        guard let last = fields.last else { return }

        // To reset the targets in case you call this method again to change the connected fields
        fields.forEach { $0.removeTarget(nil, action: nil, for: .editingDidEndOnExit) }

        for i in 0 ..< fields.count - 1 {
            fields[i].returnKeyType = .next
            fields[i].addTarget(fields[i + 1], action: #selector(UIResponder.becomeFirstResponder), for: .editingDidEndOnExit)
        }

        last.returnKeyType = .continue
        last.addTarget(last, action: #selector(UIResponder.resignFirstResponder), for: .editingDidEndOnExit)
    }
}
Run Code Online (Sandbox Code Playgroud)