如何关闭iOS键盘?


74

我有一个UITextfield,我想关闭键盘。无论我使用什么代码,我似乎都无法使键盘消失。

Answers:



192

如果您有多个文本字段而又不知道哪个是第一响应者(或者无论您在何处编写此代码,都根本无法访问文本字段),则可以endEditing:在包含文本字段的父视图上进行调用。

在视图控制器的方法中,它看起来像这样:

[self.view endEditing:YES];

该参数强制文本字段退出第一响应者状态。如果您正在使用委托来执行验证,并且想要停止所有操作直到文本字段的内容有效,那么您还可以像这样进行编码:

BOOL didEndEditing = [self.view endEditing:NO];
if (didEndEditing) {
    // on to the next thing...
} else {
    // text field must have said to first responder status: "never wanna give you up, never wanna let you down"
}

endEditing:方法比告诉单个文本字段要好得多resignFirstResponder,但是由于某种原因,直到最近我才发现它。


71
该死的!我简直不敢相信我在代码注释中被粗暴地对待了。
Lytol 2011年

8

在某些情况下,没有文本字段是第一响应者,但是键盘在屏幕上。在这些情况下,上述方法无法关闭键盘。

如何到达那里的一个例子:

  1. 以编程方式在屏幕上推送ABPersonViewController;打开任何联系人;
  2. 触摸“注释”字段(该字段将成为第一响应者并启动键盘);
  3. 在任何其他字段上向左滑动以显示“删除”按钮;
  4. 到目前为止,您在文本字段中没有第一响应者(只需以编程方式进行检查),但是键盘仍然在那里。调用[view endEditing:YES]不会执行任何操作。

在这种情况下,您还需要让视图控制器退出编辑模式:

[viewController setEditing:NO animated:YES];

8

我发现这里的情况endEditingresignFirstResponder失败。在这些情况下,这对我有用。

对象

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];    
[self setEditing:NO];

迅速

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)

正是我想要的!
Hola Soy Edu Feliz Navidad

6

我建议您对头文件进行添加和操作:

-(IBAction)removeKeyboard;

在实现中,编写如下代码:

-(IBAction)removeKeyboard
{
[self.textfield resignFirstResponder];
}

在NIB文件中,通过选项DidEndOnExit从UITextFiled连接到文件的所有者。这样,当您按回车键时,键盘将消失。

希望能帮助到你!


6

在视图控制器YourViewController.h文件中,确保实现UITextFieldDelegate协议:

@interface YourViewController : <UITextFieldDelegate>

@end

然后,在YourViewController.m文件中,实现以下实例方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.yourTextField1 resignFirstResponder];
    [self.yourTextField2 resignFirstResponder];
    ...
    [self.yourTextFieldn resignFirstResponder];
}

3

这将放弃一个特定的文本字段

// Swift
TextField.resignFirstResponder()

// Objective C
[TextField resignFirstResponder];

要放弃任何文本字段,请使用以下代码

// Swift
self.view!.endEditing(true)

// Objective C
[self.view endEditing:YES];

3

退出应用程序中的任何文本字段

UIApplication.shared.keyWindow?.endEditing(true)

这种方法是干净的,并且可以保证有效,因为根据定义,keyWindow是显示键盘的所有可能视图的根视图():

按键窗口接收键盘和其他非触摸相关事件。一次只能有一个窗口是关键窗口。


3

作为最后的手段💩

let dummyTextView = UITextView(frame: .zero)
view.addSubview(dummyTextView)
dummyTextView.becomeFirstResponder()
dummyTextView.resignFirstResponder()
dummyTextView.removeFromSuperview()

我有一个UI,其中有一个UITextField是第一响应者,但是弹出的显示建议的对话框也很活跃。使用“隐藏”按钮关闭键盘不会以某种方式隐藏键盘。这段代码对我有帮助,谢谢!:)
fl034

2

如果您不知道哪个textField是第一响应者,则可以找到它。我使用此功能:

UIView *resignFirstResponder(UIView *theView)
{
    if([theView isFirstResponder])
    {
        [theView resignFirstResponder];
        return theView;
    }
    for(UIView *subview in theView.subviews)
    {
        UIView *result = resignFirstResponder(subview);
        if(result) return result;
    }
    return nil;
}

然后在您的代码调用中:

    UIView *resigned = resignFirstResponder([UIScreen mainScreen]);

1

您只是替换yourTextFieldName为,您猜对了!您的文本字段。这将关闭键盘。

[yourTextFieldName resignFirstResponder];


1

对于Swift 3

您可以像这样隐藏键盘:

textField.resignFirstResponder()

如果要在用户按下“简介”按钮时隐藏键盘,则必须实现以下UITextFieldDelegate方法:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true
}

0
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    // your code

    [textField reloadInputViews];
}

0

3个简单快捷的步骤

添加UITextFieldDelegate到您的班级,如下所示:

class RegisterVC: UIViewController, UITextFieldDelegate {
    //class implementation 
}

在类实现中,添加委托函数textFieldShouldEndEditing:

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

最后UITextField,在适当的地方将您的代理人设置为自我。例如,在viewDidLoad函数内部:

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

现在,只要用户按下返回键,键盘就会关闭。

我也准备了一个示例代码段,您可以从此处进行检查。


-1
  1. 在Xcode中设置“退出时结束结束”事件(右键单击文本字段)。

    屏幕截图

  2. 实现此方法:

    -(IBAction) closeKeyboard:(id) sender {
        [_txtField resignFirstResponder];
    }
    
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.