Ios UITextField返回键下一个错误

Ios UITextField返回键下一个错误,ios,swift,uitextfield,Ios,Swift,Uitextfield,有问题标题的解释 以下是InputViewController的部分代码: class InputViewController: UIViewController, UITextFieldDelegate { private var firstResponderTag = 0 ... func textFieldDidBeginEditing(textField: UITextField) { firstResponderTag = textField.t

有问题标题的解释

以下是InputViewController的部分代码:

class InputViewController: UIViewController, UITextFieldDelegate {
    private var firstResponderTag = 0
    ...
    func textFieldDidBeginEditing(textField: UITextField) {
        firstResponderTag = textField.tag
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        if let nextResponder = textField.superview?.viewWithTag(textField.tag + 1) {
            nextResponder.becomeFirstResponder()
        } else {
            textField.resignFirstResponder()
        }
        return true
    }
    ...
}
class SigningInViewController: InputViewController {
    ...
    @IBOutlet
    private weak var emailTextField: TextField! {
        didSet {
            emailTextField.validator = EmailValidator()
        }
    }

    @IBOutlet
    private weak var passwordTextField: TextField! {
        didSet {
            passwordTextField.validator = PasswordValidator()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        Observable.combineLatest(emailTextField.rx_text, passwordTextField.rx_text, resultSelector: {
            (email: String, password: String) in
            email.length > 0 && password.length > 0
        }).bindTo(signInButton.rx_enabled).addDisposableTo(bag)
    }
    ...
}
和登录查看控制器:

class InputViewController: UIViewController, UITextFieldDelegate {
    private var firstResponderTag = 0
    ...
    func textFieldDidBeginEditing(textField: UITextField) {
        firstResponderTag = textField.tag
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        if let nextResponder = textField.superview?.viewWithTag(textField.tag + 1) {
            nextResponder.becomeFirstResponder()
        } else {
            textField.resignFirstResponder()
        }
        return true
    }
    ...
}
class SigningInViewController: InputViewController {
    ...
    @IBOutlet
    private weak var emailTextField: TextField! {
        didSet {
            emailTextField.validator = EmailValidator()
        }
    }

    @IBOutlet
    private weak var passwordTextField: TextField! {
        didSet {
            passwordTextField.validator = PasswordValidator()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        Observable.combineLatest(emailTextField.rx_text, passwordTextField.rx_text, resultSelector: {
            (email: String, password: String) in
            email.length > 0 && password.length > 0
        }).bindTo(signInButton.rx_enabled).addDisposableTo(bag)
    }
    ...
}
问题是,如果我按回车键“下一步”,下一个文本字段将成为第一响应者并立即退出第一响应者。但若我移除绑定,返回键将正常工作。那么,我做错了什么

UPD:

在RxSwift的官方回购协议中,我遗漏了类似的问题。 解决方案是

if let nextResponder = textField.superview?.viewWithTag(textField.tag + 1) {
    dispatch_async(dispath_get_main_queue(), {
        nextResponder.becomeFirstResponder()
    })
} else {

我无法在您的代码中找到错误的原因,但我可以分享我最近刚刚编写的代码示例

class NextTextField: UITextField, UITextFieldDelegate {

    @IBOutlet weak var returnView: UIView? {
        didSet {
            if returnView is UITextField {
                returnKeyType = UIReturnKeyType.Next
            }
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()

        delegate = self
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {

        if let nextTextField = self.returnView as? UITextField {
            nextTextField.becomeFirstResponder()
        } else if let nextButton = self.returnView as? UIButton {
            nextButton.sendActionsForControlEvents(.TouchUpInside)
        } else {
            self.resignFirstResponder()
        }

        return true
    }

}

它只是在文本字段中添加了一个弱返回视图,可以通过代码或情节提要轻松设置。当按下文本字段的返回键时,如果它是其他文本字段,它会使第一响应者返回视图;如果按钮是返回视图,则触摸按钮;如果没有返回视图,则隐藏键盘。

在Swift和RxSwift/RxCocoa 3.0.1中

placeTextField.rx.controlEvent(UIControlEvents.editingDidEndOnExit)

很好


而不是使用
textFieldShouldReturn

,不幸的是,这段代码也适用于bug以及我的bug。但感谢您使用
nextButton
提供了很好的解决方案。我认为这是RxSwift/RxCocoaDid中的一个bug。你找到解决方案了吗?@mohamed1945,是的,我找到了。您可以在UPD部分中看到它)