如何在按下回车键时快速隐藏键盘?


214

UITextfied在单击文本键盘时正在使用,但是当我按下return键时,键盘没有消失。我使用以下代码:

func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore.
{
    return true;
}

方法resignfirstresponder没有起作用。


10
您是否考虑过接受RSC答案?接受答案是使此场所正常工作的原因,被认为是一种很好的做法。
Juan Boero

7
如果任何答案满足您的要求,请标记为答案,以便其他人可以从中获得帮助。
Syed Kamruzzaman博士

Answers:


397

您可以使用以下功能使应用关闭键盘

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true)
    return false
}

这是一个完整的示例,可以更好地说明这一点:

//
//  ViewController.swift
//
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var myTextField : UITextField

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.myTextField.delegate = self
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }
}

代码源:http : //www.snip2code.com/Snippet/85930/swift-delegate-sample


22
我缺少“ self.myTextField.delegate = self;” 谢谢!
tylerlindell

4
我很想念UITextFieldDelegate
切萨雷2015年

1
@kommradHomer,毫无疑问,还有其他原因使键盘无法显示。如果需要,可以将代码放在pastebin上,然后将链接粘贴到此处,以供我查看。
rsc 2015年

1
@RSC您最有可能是对的。我是ios上的2天新手,因此以某种方式摆脱了我的问题,一切都按您的建议进行了工作:)
kommradHomer 2015年

1
因此,为我工作(第3步): func textFieldShouldReturn(textField: UITextField) -> Bool {更改为 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
sea-kg

112

return true部分仅告诉文本字段是否允许返回。
您必须手动告诉文本字段关闭键盘(或键盘的第一个响应器),并使用完成此操作resignFirstResponder(),如下所示:

// Called on 'Return' pressed. Return false to ignore.

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

2
谢谢...在我的情况下,“ resignFirstResponder()”方法没有自动获得,我认为它不支持,但是在手动编写其工作效果时很好..谢谢。
Ashwinkumar Mangrulkar 2014年

@AshwinMangrulkar,您可以预期在Beta版本的Xcode 6中,自动完成功能可能会受到限制。
Paul Brewczynski 2014年

1
当然也不需要再加上“ true”之后的分号
36 By Design

1
您的viewController符合要求UITextFieldDelegate吗?
蜂蜜

1
而不是self.view.endEditing()这个答案是适当的和正确的方法
saigen

45
  • 添加UITextFieldDelegate到类声明中:

    class ViewController: UIViewController, UITextFieldDelegate
  • 连接textfield或以编程方式编写

    @IBOutlet weak var userText: UITextField!
  • 将视图控制器设置为确实加载了视图中的文本字段委托:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
  • 添加以下功能

    func textFieldShouldReturn(userText: UITextField!) -> Bool {
        userText.resignFirstResponder()
        return true;
    }

    完成以上所有操作后,您将可以通过触摸文本框的外部以及按回车键来关闭键盘。


谢啦!我很想念这个:UITextFieldDelegate...非常感谢!
Adriano Tadao

由于某些原因,当我设置txtField.delegate = self时,一旦运行该应用程序,我将无法在该文本字段中键入内容
Jesus Rodriguez

@JesusAdolfoRodriguez该错误背后一定有原因,该代码不会引起任何问题。:D快乐编码!
Codetard '16

感谢您的逐步指导。这对我来说不仅仅是代码块。
kenhkelly,2016年

1
“通过所有这些操作,您的键盘将通过在文本字段外部触摸而开始关闭” –不是。仅在按下返回按钮时才调用textFieldShouldReturn。
侏罗纪'16

38

Swift 4.2-无需委托

您可以从UITextField为“ Primary Action Triggered ” 创建一个动作出口,并在传入的sender参数上为第一响应者辞职:

创建动作插座

@IBAction func done(_ sender: UITextField) {
    sender.resignFirstResponder()
}

超级简单。

(感谢Scott Smith的60秒视频为我提供了有关此方面的提示:https : //youtu.be/v6GrnVQy7iA


如果我们在一个页面上有多个文本字段,那么我们需要为每个文本字段都做吗……
DragonFire '19

@DragonFire您可以将多个文本字段分配给同一插座。只需从出口检查器(屏幕左侧)中的“主要操作触发”出口拖动到代码中的IBAction
Brad Root

值得一提的是,直接从情节提要中的文本字段中拖动会将链接的动作默认为“编辑已结束”,而不是“触发的主要动作”,因此应从侧边栏的“连接”检查器中完成。

惊人。我不知道。谢谢。
Numan Karaaslan

如果有人还在乎,也可以与Swift 2一起使用。谢谢。
siralexsir88

22

Simple Swift 3解决方案:将此功能添加到具有文本字段的视图控制器中:

@IBAction func textField(_ sender: AnyObject) {
    self.view.endEditing(true);
}

然后打开您的助手编辑器,并确保Main.storyboard位于视图的一侧,而所需的视图controller.swift文件位于另一侧。单击文本字段,然后从右侧的实用工具面板中选择“显示连接检查器”选项卡。控制从“退出时结束”拖动到快速文件中的上述功能。对该场景中的任何其他文本字段重复此操作,并链接到相同的功能。


14

@RSC

对我来说,Xcode 6.2(6C86e)中的关键添加是 override func viewDidLoad()

 self.input.delegate = self;

试图让它与返回键一起工作数小时,直到我找到您的帖子,RSC。谢谢!

另外,如果要在触摸屏幕上的其他任何地方时隐藏键盘,请执行以下操作:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true);
    }

12

为了自动关闭键盘,我将此代码放在自定义文本字段的类的方法之一中:

textField.addTarget(nil, action:"firstResponderAction:", forControlEvents:.EditingDidEndOnExit)

用网点名称代替textField


1
优秀。我认为这是最短和最好的选择。特别是在另一个方法中创建文本字段时。就像在表格视图标题内一样。
kakubei

抱歉,您到底要把它放在哪里,要关闭键盘必须做什么?我将mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(Swift 5版本)放进去了,viewDidLoad但是既没有返回,也没有点击文本框外的某个地方。我通过创建每个插座来获得文本字段。
Neph

我将其放在自UIViewController继承的自定义类的子类中。该子类还符合UITextViewDelegate和UITextFieldDelegate。我把它放在viewDidAppear那个类的方法中。UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })这可能对我的情况而言太具体了,但希望能有所帮助。尝试在内部进行呼叫,viewDidAppear并在必要时与任何代表保持一致。
Peacetype

10

另一种主要使用情节提要并轻松允许您具有多个文本字段的方式是:

@IBAction func resignKeyboard(sender: AnyObject) {
    sender.resignFirstResponder()
}

Did End On Exit每个字段发生事件时,将该视图控制器的所有文本字段连接到该动作。


不好意思,但是我在我的应用程序中尝试了这种方法,它似乎没有用。如您所说,我在导航栏中有一个文本字段,并且已将其与该事件关联到此操作,但在运行时不起作用。
wasimsandhu

如果发件人的类型为UIBarButtonItem,则会崩溃。如果我将带有“完成”按钮的工具栏添加到数字小键盘,则您的代码将因无法识别的选择器发送到实例日志而崩溃。
Jayprakash Dubey

8

我想从RSC初始化Class:

import Foundation
import UIKit

// Don't forget the delegate!
class ViewController: UIViewController, UITextFieldDelegate {

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

@IBOutlet var myTextField : UITextField?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.myTextField.delegate = self;
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

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

}


8

当用户点击文本键盘上的“完成”按钮时,将生成“退出时结束”事件。那时,我们需要告诉文本字段放弃控制,以便键盘消失。为此,我们需要在控制器类中添加一个动作方法。选择ViewController.swift添加以下操作方法:

@IBAction func textFieldDoneEditing(sender: UITextField) {
sender.resignFirstResponder()}

在“项目浏览器”中选择Main.storyboard,然后打开连接检查器。从退出结束时的圆圈旁边拖动到情节提要中的黄色“视图控制器”图标,然后放开。将会出现一个小的弹出菜单,其中包含一个我们刚刚添加的动作的名称。单击textFieldDoneEditing操作以选择它,仅此而已。



7

我讨厌向每个UIViewController添加相同的功能。通过扩展UIViewController以支持UITextFieldDelegate,可以提供默认行为“按回车”。

extension UIViewController: UITextFieldDelegate{
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true;
    }
}

创建新的UIViewController和UITextField时,只需在UIViewController中编写一行代码即可。

override func viewDidLoad() {
    super.viewDidLoad()
    textField.delegate = self
}

您甚至可以通过挂钩Main.storyboard中的委托来省略这一行代码。(使用“ ctrl”并将其从UITextField拖动到UIViewController)


5

迅捷3

将以下代码添加到您的VC中

//hide keyboard when user tapps on return key on the keyboard
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true);
    return false;
}

为我工作


3

确保将textField委托设置为用于编写与文本字段相关的代码的视图控制器。

self.textField.delegate = self

3

迅速

使用中的可选功能UITextFieldDelegate

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    return textField.endEditing(false)
}

false表示可以要求辞职。true–强制辞职。


3
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleScreenTap(sender:)))
    self.view.addGestureRecognizer(tap)}

然后你使用这个功能

func handleScreenTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}

2

您可以将其放在任何地方,但不能放在UIButton中

 func TextFieldEndEditing(text fiend name: UITextField!) -> Bool
{
    return (false)
}

然后您可以将此代码放在按钮中(例如):

self.view.endEditing(true)

这对我有用


2

在视图控制器中,您正在使用:

//suppose you are using the textfield label as this

@IBOutlet weak var emailLabel: UITextField!
@IBOutlet weak var passwordLabel: UITextField!

//then your viewdidload should have the code like this
override func viewDidLoad() {
        super.viewDidLoad()

        self.emailLabel.delegate = self
        self.passwordLabel.delegate = self

    }

//then you should implement the func named textFieldShouldReturn
 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

// -- then, further if you want to close the keyboard when pressed somewhere else on the screen you can implement the following method too:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true);
    }

我喜欢touchesBegan func,很快就可以工作4谢谢。
AJ Hernandez '18


-1

一键隐藏键盘并在打开的键盘上移动视图:Swift 5

override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: self, action: #selector(taped))
    view.addGestureRecognizer(tap)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}


   override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
 @objc func taped(){

    self.view.endEditing(true)

}

@objc func KeyboardWillShow(sender: NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y == 0{
        self.view.frame.origin.y -= keyboardSize.height
    }


}

@objc func KeyboardWillHide(sender : NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y != 0{
        self.view.frame.origin.y += keyboardSize.height
    }

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.