Swift - 如何在文本字段之外点击后关闭数字键盘

Posted

技术标签:

【中文标题】Swift - 如何在文本字段之外点击后关闭数字键盘【英文标题】:Swift - How to dismiss number keyboard after tapping outside of the textfield 【发布时间】:2015-01-10 16:59:51 【问题描述】:

在键盘外点击时如何从 UITextField 中关闭键盘。我试过resignFirstResponder(),它只在输入一个数字后退出。我也试过textField.inputView = UIView.frame(frame: CGRectZero)。我已经看到了很多我所要求的 Obj-C 版本,但我需要 Swift 等价物,因为我没有 Objective-C 的编程经验

感谢您的时间和耐心。

【问题讨论】:

textField.resignFirstResponder() 应该可以正常工作。这是上传的示例示例dropbox.com/s/e0vm89gd6uegpn0/textfield.zip?dl=0 还要在实际设备上检查你/我的代码。 【参考方案1】:

向视图添加轻击手势识别器并调用 resignFirstResponder() 或 self.view.endEditing(true) 的最佳方法。我更喜欢 endEditing() 因为 resignFirstResponder 必须分别为每个文本字段完成,这与为视图本身完成的 endEditing 不同。

在 viewDidLoad 中,编写如下代码:

let tapRecognizer = UITapGestureRecognizer()
tapRecognizer.addTarget(self, action: "didTapView")
self.view.addGestureRecognizer(tapRecognizer)

现在编写 didTapView 方法来关闭键盘:

func didTapView()
  self.view.endEditing(true)

现在,当您在控制器的主视图上点击键盘外部时,它将调用 didTapView 方法并关闭键盘。

Swift 3.x

viewDidLoad 中的代码应该是:

let tapRecognizer = UITapGestureRecognizer()
tapRecognizer.addTarget(self, action: #selector(ViewController.didTapView))
self.view.addGestureRecognizer(tapRecognizer)

其中 ViewController 应该是您的视图控制器的名称。

谢谢

【讨论】:

didTapView 函数放在哪里 只需在您拥有的同一个视图控制器类中添加 func。 Swift 3 要求我添加一个选择器,如下tapRecognizer.addTarget(self, action: #selector(MyViewController.didTapView)) 还添加了 Swift 3 语法。谢谢@ChristyHerron【参考方案2】:

Swift 3 经过测试并可以正常工作

 // dismiss keyboard on touch outside textfield
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
        for txt in self.view.subviews 
            if txt.isKind(of: UITextField.self) && txt.isFirstResponder 
                txt.resignFirstResponder()
            
        
       

享受

Swift 2.3 经过测试并可以正常工作

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
        for txt in self.view.subviews 
            if txt.isKindOfClass(UITextField.self) && txt.isFirstResponder() 
                txt.resignFirstResponder()
            
        
    

享受

【讨论】:

【参考方案3】:

您也可以使用此方法在按下“Return”时关闭键盘

func textFieldShouldReturn(textField: UITextField!) -> Bool 
        self.view.endEditing(true);
        return false;

确保设置您的委托

【讨论】:

【参考方案4】:

如果您不想定义额外的方法,还有一种稍微简单的方法也可以使用

let tapRecognizer = UITapGestureRecognizer(target: self, action: "endEditing:")
view.addGestureRecognizer(tapRecognizer)

【讨论】:

使用这个我得到错误,use of string literal for Objective-C seletors is deprecated; use '#selector' instead。如果我找到解决方案,我会发布。 endEditing:无法识别的选择器发送到实例【参考方案5】:

我在一个网站上找到了这段代码,它对我很有用!

//FUNCTION TO DISMISS THE KEYBOARD
 func initializeHideKeyboard()
 //Declare a Tap Gesture Recognizer which will trigger our dismissMyKeyboard() function
 let tap: UITapGestureRecognizer = UITapGestureRecognizer(
 target: self,
 action: #selector(dismissMyKeyboard))
 //Add this tap gesture recognizer to the parent view
 view.addGestureRecognizer(tap)
 

 @objc func dismissMyKeyboard()
 //endEditing causes the view (or one of its embedded text fields) to resign the first responder status.
 //In short- Dismiss the active keyboard.
 view.endEditing(true)
 

然后只需在按钮操作或类似操作中调用此函数:

dismissMyKeyboard()

【讨论】:

以上是关于Swift - 如何在文本字段之外点击后关闭数字键盘的主要内容,如果未能解决你的问题,请参考以下文章

如果我们在后台点击任何地方,除了在 swift 中点击 popView 之外,如何删除 popView

如何将第二个viewcontroller文本字段值传递给第一个viewcontroller数组并在swift4中点击按钮时关闭

IOS swift - 如何在点击文本字段时打开新视图控制器后结束文本字段中的编辑

如何在swift ui watch os中的同一屏幕中添加键盘和文本字段[关闭]

插入多个字符时关闭文本字段

在弹出视图之外的任何地方点击时关闭弹出视图,包括按钮、文本字段等