簡體   English   中英

向后導航后不需要的鍵盤

[英]Unwanted Keyboard after Back Navigation

我的應用程序中的所有UIViewController均由頂級UINavigationController 在當前位於我的導航堆棧頂部的UIViewController ,我有一組UITextField

當我在這些文本字段之一上調用becomeFirstResponder() ,然后立即導航回而不先改變焦點時,例如通過點擊另一個字段,就會出現問題。 向后瀏覽一個級別后,出現鍵盤,但我找不到辦法阻止它出現或消失。 當我進一步推送導航堆棧的視圖時,它甚至保持不變。

  1. 它直接或間接連接到becomeFirstResponder()調用,因為沒有該調用,就不會發生此問題。
  2. 即使我出於測試目的,在becomeFirstResponder() resignFirstResponder()之后立即調用becomeFirstResponder() ,鍵盤仍會在向后導航后出現。

我嘗試了其他方法,例如檢測並辭職第一響應者或在viewWillDisappear()調用endEditing() ,但未成功。 從堆棧彈出相應的視圖后,我什至不確定此鍵盤屬於什么鍵盤。 我無法在View Debugger中檢查鍵盤,因為它沒有出現在那里。

為什么會出現鍵盤,如何防止出現?

事實證明,抓住第一響應者的表單驗證一直在收回它,直到字段內容有效為止。 如果在向后導航之前未釋放狀態,則鍵盤將保持不變,並且很難將第一響應者分配給另一個控件。

在我的情況下,解決方案是更仔細地跟蹤哪個字段是第一響應者,檢測后退按鈕的按下,在這種情況下允許無條件地辭職第一響應者,然后為該字段退出第一響應者。

var currentTextField: UITextField?

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    if let currentField = self.currentTextField {
        currentField.resignFirstResponder()
    }
}

override public func willMoveToParentViewController(parent: UIViewController?) {
    if (parent == nil) {
        backButtonPushed = true
    }
    super.willMoveToParentViewController(parent)
}

func customTextFieldDidBeginEditing(textField: UITextField) {
    currentTextField = textField
}

public func textFieldShouldEndEditing(textField: UITextField) -> Bool {

    // ...
    // Must return true if back button is pushed.
    if backButtonPushed {
        return true
    } else {
        // ...
    }
}

您是否嘗試改為在新VC的viewWillAppear()中調用endEditing()?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM