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