【问题标题】:textFieldShouldReturn not being called after upgrade in Swift 4在 Swift 4 中升级后未调用 textFieldShouldReturn
【发布时间】:2018-02-07 11:25:45
【问题描述】:

我有一个视图控制器,上面有几个UITextFields。当 UITextField 获得焦点时,如果我点击键盘上的 Return 键,我会转到下一个 UITextField。如果下一个UITextField 在键盘下方,我将视图向上移动。

一切都很好,直到昨天我将应用程序升级到 Swift 4,经过一些更改。现在它不再工作了。我加载了 Swift 3 版本,它工作得很好。问题是我看不出有什么区别,我想不通。

class ServerWizardVC: UIViewController, UITextViewDelegate, UIDocumentMenuDelegate, UIDocumentPickerDelegate, FileManagerDelegate

@IBOutlet weak var tfServerURL: UITextField!
@IBOutlet weak var tfServerUser: UITextField!
@IBOutlet weak var tfServerPassword: UITextField!
@IBOutlet weak var tfServerPort: UITextField!

override func viewDidLoad()
{
    print("ServerWizardVC > viewDidLoad")

    super.viewDidLoad()

    tfServerURL.tag = 0

    registerForKeyboardNotifications()
    deregisterFromKeyboardNotifications()
}

override func viewWillAppear(_ animated: Bool)
{
    print("ServerWizardVC > viewWillAppear")

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
}

func registerForKeyboardNotifications()
{
    print("ServerWizardVC > registerForKeyboardNotifications")

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
}

func deregisterFromKeyboardNotifications()
{
    print("ServerWizardVC > deregisterFromKeyboardNotifications")

    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

@objc func keyboardWillShow(notification:NSNotification)
{
    print("ServerWizardVC > keyboardWillShow")

    let userInfo:NSDictionary = notification.userInfo! as NSDictionary
    let keyboardFrame:NSValue = userInfo.value(forKey: UIKeyboardFrameEndUserInfoKey) as! NSValue
    let keyboardRectangle = keyboardFrame.cgRectValue
    let keyboardHeight = keyboardRectangle.height

    keyboardHeightValue = keyboardHeight
}

@objc func keyboardWasShown(notification: NSNotification)
{
    print("ServerWizardVC > keyboardWasShown")
}

@objc func keyboardWillBeHidden (notification: NSNotification)
{
    print("ServerWizardVC > keyboardWillBeHidden")
}

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

    if let nextField = tfServerURL.superview?.viewWithTag(textField.tag + 1) as? UITextField
    {
        nextField.becomeFirstResponder()

        checkTextFieldPosition(tfTag: textField.tag + 1)
    }
    else
    {
        vMainView.frame.origin.y = 0

        textField.resignFirstResponder()
    }

    return false
}

func checkTextFieldPosition(tfTag : Int)
{
    print("ServerWizardVC > checkTextFieldPosition")

    let keyboardTop = mainViewHeight - keyboardHeightValue
    let tfServerPasswordTop =  tfServerPassword.frame.origin.y

    if(tfTag == 3)
    {
        if((keyboardTop < tfServerPasswordTop) && (vMainView.frame.origin.y == 0))
        {
            let yPosition = vMainView.frame.origin.y - keyboardHeightValue + 100
            vMainView.frame.origin.y = yPosition
        }
    }
}

我将这归咎于 Swift 4 升级的原因是我什至没有接触过这个类,其他一切都很好。
我有什么遗漏吗?

【问题讨论】:

  • 使用Notification 而不是NSNotification

标签: ios swift uitextfield swift4 uitextfielddelegate


【解决方案1】:

textFieldShouldReturn 是一个 UITextFieldDelegate 函数,但您的类改为符合 UITextViewDelegate。将一致性替换为UITextFieldDelegate

class ServerWizardVC: UIViewController, UITextFieldDelegate, UIDocumentMenuDelegate, UIDocumentPickerDelegate, FileManagerDelegate

【讨论】:

  • 我不敢相信我一直没有注意到这一点。现在它起作用了。但这带来了另一个问题:为什么旧版本可以工作?
  • @daydr3am3r 确实是个好问题。可能是转换器搞砸了一些事情并替换了您的委托一致性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多