UITextField委托textFieldShouldReturn不与硬件键盘返回一起调用

时间:2019-02-28 01:11:20

标签: swift uitextfield uikit

iOS 12,Xcode 10.1。我有一个具有UITextField的视图。委托连接已连接到情节提要中的视图控制器。我已经做过无数次了。

在键盘上按Return键时,我想将第一响应者发送到下一个字段,所以正确的方法如下:

extension SignInViewController: UITextFieldDelegate {

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
      switch textField {
      case loginEmailField:
        loginPasswordField.becomeFirstResponder()
      case loginPasswordField:
        loginPasswordField.resignFirstResponder()
        signInTapped(sender: UIButton())
      default: break
      }
    return true
    }
}

在连接了带键盘保护套的iPad Pro或带模拟器的Mac上连接了硬件键盘后,委托方法不会触发。调出屏幕键盘,效果很好。

我以前已经实施过类似的事情,但我一直在努力地想知道它们之间的任何差异,但无济于事。我可以寻找什么潜在的原因来解决此问题,并使硬件键盘的Return键起作用?

2 个答案:

答案 0 :(得分:1)

我已经尝试过此方法,并且在模拟器上同时使用Mac键盘和外部蓝牙键盘在模拟器上按下 Return / Enter 键时,textFieldShouldReturn被正确调用和iPad。也许您的UITextFieldDelegate设置存在问题?

我还尝试通过代码(如下所示)和通过Interface Builder连接delegate,并且两者都可以正常工作。

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textFieldA: UITextField!
    @IBOutlet var textFieldB: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        textFieldA.delegate = self
        textFieldB.delegate = self
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {

        switch textField {
        case textFieldA:
            textFieldB.becomeFirstResponder()
        case textFieldB:
            textFieldB.resignFirstResponder()
        default:
            break
        }
        return true
    }
}

答案 1 :(得分:0)

您可以从NotificationCenter收听UIKeyboardWillHideNotification