我已经看到这个问题在各地被问过数百万次,但没有一个答案对我有用。
我需要从 UITextField 中删除焦点。这意味着我需要光标消失(并且键盘消失)。
我在互联网上看到的解决方案是
[textfield resignFirstResponder]
或 [textfield endEditing:YES]
,它能够隐藏键盘,但不会从 UITextField 中移除焦点(即光标仍在 UITextField 内愉快地闪烁,尽管键盘已关闭)被解雇)。
问题是,当用户点击 UITextField 并触发事件 didBeginEditing 时,我需要获取事件。每次触发该事件时,或者更一般地说,每次用户点击 UITextField 时,我都会做一些事情。但是,如果焦点没有完全从 UITextField 中移除,即使在我调用
resignFirstResponder
或 endEditing:YES
后,该事件也无法再次触发。
我怎样才能实现这个目标?谢谢。
您可以将光标颜色设置为透明色
textfeild.tintColor = UIColor.clearColor()
如果你只是想关闭键盘那么
textfeild.resignFirstResponder()
将关闭键盘,当您想要再次获得焦点时使用
textfeild.becomeFirstResponder()
我很久以前也遇到过同样的问题。
我有一个包含
UITextField
和其他一些控件的屏幕,其中一些出现在屏幕键盘的下方(是的,我现在知道我应该使用约束来确保屏幕上的 UIView
适合可见的屏幕的一部分)。我的情况的问题是,在模态屏幕上,一旦出现屏幕键盘,即使您尝试使用
resignFirstResponder
,您也无法永远
摆脱它。 苹果明智地故意这样设计,以避免用户因键盘的出现和消失而烦恼。 嗯嗯。我的解决方案很简单:
使您的
UITextField
禁用。 即使只是一瞬间,您也可以重新启用它。 这将使屏幕键盘很好地滑开。
didBeginEditing
,为什么不直接创建 UITextField 的子类并像这样覆盖
touchesBegan
class SpecialTextField: UITextField {
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("touched textfield")
}
}
然后您可以使用它通过委托方法或直接以某种方式触发您的事件
所以你只需要:
DispatchQueue.main.async {
textView.resignFirstResponder()
}
@State private var isTextFieldDisabled = false // New state variable for text field
...
TextField("Enter command here", text: $commandText)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding(.bottom, 20)
.disabled(isTextFieldDisabled) // Disable based on state variable
...
Button(action: {
handleCommandSubmission()
}) {
Text("Submit")
...
}
...
// Function to handle the command submission
private func handleCommandSubmission() {
isTextFieldDisabled = true // Disable the text field
handleCommand(commandText) // Handle the command
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
isTextFieldDisabled = false // Re-enable the text field after 100ms
}
}