2016-02-28 27 views
0

在我的應用程序中的所有UIViewController由頂級UINavigationController管理。在當前位於導航堆棧頂部的UIViewController中,我有一組UITextField s。返回導航後不需要的鍵盤

當我在這些文本字段中的一個上調用becomeFirstResponder(),然後立即返回而沒有首先改變焦點時發生問題,例如,通過點擊另一個領域。在導航回到一級之後,出現鍵盤,並且我找不到任何方法使其不顯現或消失。它甚至停留在我進一步推動導航堆棧的視圖。

  1. 這是直接或間接地連接到 becomeFirstResponder()呼叫,因爲沒有該呼叫,不發生 問題。
  2. 即使爲了測試目的,請在becomeFirstResponder() 之後立即撥打 resignFirstResponder()鍵盤在導航回來後仍然出現。

我嘗試過其他方法,如檢測並退出第一響應者或在viewWillDisappear()中調用endEditing()但未成功。我甚至不確定在相應的視圖彈出堆棧之後這個鍵盤屬於什麼。我無法檢查視圖調試器中的鍵盤,因爲它沒有出現在那裏。

爲什麼鍵盤出現,我該如何防止它?

回答

2

事實證明,抓取第一響應者的表單驗證一直在收回它,直到字段內容有效。如果它在返回導航之前沒有釋放狀態,則鍵盤保持不動,並且將第一響應者分配給另一控制器變得困難。

本例中的解決方案是更仔細地跟蹤哪個字段是第一響應者,檢測後退按鈕的推送,允許在這種情況下無條件退出第一響應者,然後辭去該字段的第一響應者。

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 { 
     // ... 
    } 
} 
0

您是否試圖在新VC的viewWillAppear()中調用endEditing()而不是?

+0

是的,我試過了。 – jerry

+0

這不是一個答案,而是一個問題的細節問題。請使用評論。 – pczeus