如何从 UITextField 中移除焦点?

问题描述 投票:0回答:5

我已经看到这个问题在各地被问过数百万次,但没有一个答案对我有用。

我需要从 UITextField 中删除焦点。这意味着我需要光标消失(并且键盘消失)。

我在互联网上看到的解决方案是

[textfield resignFirstResponder]
[textfield endEditing:YES]
,它能够隐藏键盘,但不会从 UITextField 中移除焦点(即光标仍在 UITextField 内愉快地闪烁,尽管键盘已关闭)被解雇)。

问题是,当用户点击 UITextField 并触发事件 didBeginEditing 时,我需要获取事件。每次触发该事件时,或者更一般地说,每次用户点击 UITextField 时,我都会做一些事情。但是,如果焦点没有完全从 UITextField 中移除,即使在我调用

resignFirstResponder
endEditing:YES
后,该事件也无法再次触发。

我怎样才能实现这个目标?谢谢。

ios objective-c uitextfield
5个回答
5
投票

您可以将光标颜色设置为透明色

  textfeild.tintColor = UIColor.clearColor()

如果你只是想关闭键盘那么

    textfeild.resignFirstResponder()

将关闭键盘,当您想要再次获得焦点时使用

 textfeild.becomeFirstResponder()

3
投票

我很久以前也遇到过同样的问题。

我有一个包含

UITextField
和其他一些控件的屏幕,其中一些出现在屏幕键盘的下方(是的,我现在知道我应该使用约束来确保屏幕上的 UIView
 适合可见的屏幕的一部分)。

我的情况的问题是,在模态屏幕上,一旦出现屏幕键盘,即使您尝试使用

resignFirstResponder,您也无法永远

摆脱它。  苹果明智地故意这样设计,以避免用户因键盘的出现和消失而烦恼。  嗯嗯。

我的解决方案很简单:

使您的

UITextField

 
禁用。 即使只是一瞬间,您也可以重新启用它。

这将使屏幕键盘很好地滑开。


1
投票
如果您只需要检测何时触摸文本字段而不是特定的

didBeginEditing

,为什么不直接创建 UITextField 的子类并像这样覆盖 
touchesBegan


class SpecialTextField: UITextField { override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { print("touched textfield") } }

然后您可以使用它通过委托方法或直接以某种方式触发您的事件


1
投票
如果有人仍然面临这个问题,如果没有从主队列调用 resignFirstResponder() ,光标就会保留。

所以你只需要:

DispatchQueue.main.async { textView.resignFirstResponder() }


0
投票
迈克·格莱德希尔的上述回答对我来说非常有效。我在 SwiftUI 中用来暂时禁用文本字段并摆脱键盘的代码是这样的:

@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 } }
    
© www.soinside.com 2019 - 2024. All rights reserved.