如何在按下UITextField的回车键时隐藏键盘?

156

当单击文本字段时,会弹出键盘。用户按下回车键后,如何隐藏键盘?


13
Stack Overflow的好处在于许多问题已经得到了解答,特别是一些简单的问题。因此,在提问之前请先查找答案。很简单:http://stackoverflow.com/search?q=iphone+hide+keyboard - Felixyz
这是一个UITextfield的子类,根据文本/字符串条件动态更改UIReturnKey: https://github.com/codeinteractiveapps/OBReturnKeyTextField - CodeInteractive
@Felixyz,那里的第一个问题具有讽刺意味,是关于Android的。 - Iulian Onofrei
@IulianOnofrei 我想这可能会随着时间的推移而改变。但是,十年后收到回复还是很不错的 :) 发现我十年前写了这样一个讽刺的评论并不好。 (或许为自己辩护,那时候还不太清楚讽刺是一种永久威胁着互联网所有美好事物的病菌。) - Felixyz
@Felixyz,别担心,我懂你的感受:D - Iulian Onofrei
12个回答

299

首先让你的文件成为UITextField的代理

@interface MYLoginViewController () <UITextFieldDelegate>

@end

然后将此方法添加到您的代码中。

- (BOOL)textFieldShouldReturn:(UITextField *)textField {        
    [textField resignFirstResponder];
    return YES;
}

还需添加 self.textField.delegate = self;


1
好奇的是,为什么不需要使用 <UITextFieldDelegate>?通常在这种情况下会出现警告。 - pixelfreak
7
如果您使用Interface Builder将文件委托,则.h文件中不需要<UITextFieldDelegate>。 - Saurabh
1
在.h文件中添加<UITextFieldDelegate>,并在viewdidload中设置委托[yourTextField setDelegate:self];即可完成! - Umit Kaya
@Saurabh,故事板创建的VC有什么特别之处? - Paweł Brewczynski

63

viewDidLoad 中声明:

[yourTextField setDelegate:self];

然后,包括覆盖代理方法:

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

6
感谢提醒使用setDelegate:方法。我之前忘记了这一点,代码也没有正常工作。 - Piper
2
这不应该是textField,而不是yourTextField,因为它被传递进来了吗? - Clive Jefferies
这是一种声明textField委托的方式。 - oscar castellon
1
<UITextFieldDelegate> 应该在 .h 文件中,否则会出现警告! - Umit Kaya

24

Swift中尝试以下操作:

步骤1:将代理设置为textField的自身

textField.delegate = self

步骤2:将此UITextFieldDelegate添加到您的类声明下方,

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

15

在Swift中,可以像这样做:
首先,在你的ViewController中实现这个UITextFieldDelegate,例如:

class MyViewController: UIViewController, UITextFieldDelegate {
....
}

现在在您想要在其中键入返回时取消键盘的 TextField 中添加委托,如下所示在 viewDidLoad 方法中或在初始化它的地方。

例如。

override func viewDidLoad() {

    super.viewDidLoad()   
    myTextField.delegate = self
}

现在添加这个方法。

func textFieldShouldReturn(textField: UITextField) -> Bool {

    textField.resignFirstResponder()
    return true
}

1
如果您在IB中设置了委托,则不需要执行第二步。 - hris.to
在当前版本的Swift中,似乎应该在“textField:”之前加下划线。 - Bryce Sandlund

3

Swift 4

在视图控制器中,设置UITextField的代理:field.delegate = self,然后进行以下操作:

extension ViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // don't force `endEditing` if you want to be asked for resigning
        // also return real flow value, not strict, like: true / false
        return textField.endEditing(false)
    }
}

你如何处理希望用户在按下回车键后“制表”到下一个文本字段,直到最后一个文本字段然后退出?同时在SwiftUI中。 - Learn2Code
@Learn2Code 创建一个管理器,收集文本字段并链接它们,最后一个将触发完成函数。 - dimpiax

2

设置UITextField的代理,并重写textFieldShouldReturn方法,在该方法中只需编写以下两行代码:

[textField resignFirstResponder];
return YES;

就是这样。在编写代码之前,不要忘记设置UITextField的代理,并从属性窗口中将返回键类型设置为“完成”(command + shift + I)。


2

尝试这个:

[textField setDelegate: self];

然后,在textField代理方法中

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

那不是最佳实践。 - orafaelreis
在接口定义中需要UITextFieldDelegate。 - Alp Altunel
@AlpAltunel:感谢您的评论,那是4年前的事了。 - Vineesh TP

2

定义这个类,然后将您的文本字段设置为使用此类,这将自动化整个隐藏键盘当按下返回键时。


class TextFieldWithReturn: UITextField, UITextFieldDelegate
{

    required init?(coder aDecoder: NSCoder) 
    {
        super.init(coder: aDecoder)
        self.delegate = self
    }

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

}

在Storyboard中,您只需要将字段设置为使用该类:

输入图像描述

最初的回答:


1
如果您想针对特定的键盘隐藏键盘,请使用[self.view resignFirstResponder]; 如果您想从视图中隐藏任何键盘,请使用[self.view endEditing:true];

1

好的,我认为对于初学者来说可能有点困惑。我认为在Swift4中正确的答案是以上所有内容的混合。

要么创建一个扩展,要么使用您想要使用此功能的ViewController,但请确保实现UITextFieldDelegate。出于可重用性考虑,我发现使用扩展更容易:

extension UIViewController : UITextFieldDelegate {
    ...
}

但是另一种方法同样有效:
class MyViewController: UIViewController {
    ...
}

根据之前的选项,添加方法textFieldShouldReturn(在扩展中或在您的ViewController中)。

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

在您的viewDidLoad方法中,将textfield的代理设置为self。
@IBOutlet weak var myTextField: UITextField!
...

override func viewDidLoad() {
    ..
    myTextField.delegte = self;
    ..
}

这应该就是全部了。现在,当你按下return键时,textFieldShouldReturn方法将被调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接