按返回键如何在swift中隐藏键盘?

时间:2014-06-12 09:30:01

标签: ios swift uitextfield

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

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

方法resignfirstresponder没有进入功能。

20 个答案:

答案 0 :(得分:341)

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

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

答案 1 :(得分:90)

return true部分仅告知文本字段是否允许返回 您必须手动告诉文本字段以关闭键盘(或者它的第一响应者是什么),这是通过resignFirstResponder()完成的,如下所示:

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

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

答案 2 :(得分:43)

  • 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;
    }
    

    所有这些键盘将通过触摸文本区域以及按返回键开始解除。

答案 3 :(得分:22)

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

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

然后打开助理编辑器并确保您的Main.storyboard位于视图的一侧,并且所需的视图controller.swift文件位于另一侧。单击文本字段,然后从右侧实用程序面板中选择'显示连接检查器'标签。控制来自“退出时结束”的拖动'你的swift文件中的上述函数。对该场景中的任何其他文本字段重复并链接到同一个函数。

答案 4 :(得分:13)

@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); }

答案 5 :(得分:11)

要解除自动键盘,我将此代码放在自定义文本字段的一个方法中:

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

textField代替你的出口名称。

答案 6 :(得分:10)

另一种方法是主要使用故事板并轻松地允许您拥有多个文本字段:

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

将该视图控制器的所有文本字段连接到每个字段的Did End On Exit事件上的该操作。

答案 7 :(得分:10)

Swift 4.2-无需委托

您可以从UITextField中为“ 已触发的主要操作”创建操作出口,并在传入的发件人参数上对第一响应者进行签名:

Create Action Outlet

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

超级简单。

(感谢Scott Smith的60秒视频向我提示了https://youtu.be/v6GrnVQy7iA

答案 8 :(得分:8)

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

document.cookie

在Project Navigator中选择Main.storyboard,然后打开连接检查器。从“结束时退出”旁边的圆圈拖动到故事板中的黄色“视图控制器”图标,然后松开。将出现一个小弹出菜单,其中包含我们刚刚添加的单个操作的名称。单击textFieldDoneEditing操作以选择它以及它。

答案 9 :(得分:7)

我建议从RSC初始化该类:

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;
}

}

答案 10 :(得分:6)

以下是对和平式评论的Swift 3.0更新:

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)

答案 11 :(得分:5)

Swift 3

将以下代码添加到您的VC

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

为我工作

答案 12 :(得分:3)

夫特

使用UITextFieldDelegate中的可选功能。

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

false表示可以要求该字段辞职。 true - 强制辞职。

答案 13 :(得分:2)

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

self.textField.delegate = self

答案 14 :(得分:2)

你可以将它放在任何地方,但不能放在UIButton

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

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

self.view.endEditing(true)

这对我有用

答案 15 :(得分: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);
    }

答案 16 :(得分:0)

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)
}

答案 17 :(得分:0)

我讨厌为每个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)

答案 18 :(得分:-1)

您应该将UITextfied与视图控制器的委托连接起来,以使该函数称为

答案 19 :(得分:-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
    }

}