2017-03-06 139 views
0

我在我的VC中有兩個textFields和一個Done按鈕,但我在編輯結束時遇到了一些問題。Swift:無法讓UITextField關閉鍵盤

當我在一個textField抽頭的另一個,或當我點擊文本框外內後(因爲我添加了一個抽頭識別器到父視圖)我textFieldDidEndEditing方法被調用而不是當我點擊Done按鈕。

而且,最重要的(特別是當我在實際設備上運行時),即使我的textFieldDidEndEditing方法調用resignFirstResponder(),鍵盤在任何這些情況下都不會消失。

爲什麼鍵盤沒有打開?另外,有沒有辦法讓textFieldDidEndEditing在我自動打出場外時(而不是來自水龍頭識別器)?這似乎應該是它的工作方式,但如果我錯了,我錯了。

下面是我的代碼的一些相關部分。

1.嘗試關閉鍵盤。該方法的第一部分工作,並存儲值(當方法被調用時,就是這樣)。光標不會從textField中消失,鍵盤也不會被解除。

 func textFieldDidEndEditing(_ textField: UITextField) { 
    if let playerName = textField.text, let playerNum = nameFields.index(of: textField) { 
     playerNames[playerNum] = playerName 
    } 
    resignFirstResponder() 
} 

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textFieldDidEndEditing(textField) 
    return true 
} 

而且,這裏有一個奇怪的事情:當我在textFieldDidEndEditing和調試設置斷點,在一個字段中輸入一個值,然後按Done,它塞格斯到下一個場景,並然後停在textFieldDidEndEditing,這在這一點上沒有效果(可以存儲這些值,但它們不會反映在新場景中)。

2.嘗試添加水龍頭識別器到完成按鈕。我的代碼中沒有完成按鈕的出口,只是出於懶惰,所以這可能是最好的解決方案。但是,我仍然感興趣,爲什麼這不起作用。這與定義在父視圖中工作的輕敲識別器的代碼相同。

func dismiss(_ sender:UITapGestureRecognizer) { 
    nameFields.forEach { textFieldDidEndEditing($0) } 
} 

override func viewDidAppear(_ animated: Bool) { 
    for view in view.subviews where view is UIButton { 
     let dismissTextField = UITapGestureRecognizer(target: self, action: #selector(dismiss(_:))) 
     dismissTextField.numberOfTapsRequired = 1 
     view.addGestureRecognizer(dismissTextField) 
    } 
} 

回答

3

你需要調用,而不是調用textFieldDidEndEditingresignFirstRespondertextFieldShouldReturn方法。

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder() 
    return true 
} 

而且在TapGesture方法只需撥打endEditing(_:)view,而不是通過文本框的陣列循環。

func dismiss(_ sender:UITapGestureRecognizer) { 
    self.view.endEditing(true) 
} 
+0

噢,我的天啊,我好蠢。我在正確的地方稱呼它,但是我沒有把它叫到任何東西上。只需將'resignFirstResponder()'改爲'textField.resignFirstResponder()'就可以解決所有問題。那麼,在代碼中爲done按鈕添加一個插座動作。謝謝! –

+0

@JonathanTuzman歡迎伴侶:) –