轻松解除键盘的方法?

Sev*_*oes 375 sdk cocoa-touch objective-c

我的桌子中有很多控制台分散在我的桌子中,我想知道是否有一种更简单的方法来解除键盘,而不必遍历所有控件并将它们全部作为第一响应者重新签名.我想这个问题是..我如何才能获得键盘当前的第一响应者?

小智 792

尝试:
__CODE__

  • chrisben:您可以使用YES/NO,TRUE/FALSE,0/1. (24认同)
  • 答案没有错,但有点不正确,实际应该是:`[self.view endEditing:YES];`因为BOOL值在Objective-C中是YES/NO. (14认同)
  • 正如文档所述:_"此方法查看当前视图及其子视图层次结构,查找当前第一个响应者的文本字段.如果找到一个,则要求该文本字段作为第一响应者辞职.如果force参数是设置为YES,文本字段永远不会被询问;它被迫辞职."_ - 所以这是IMO对原始问题的正确答案(用例:我有一个包含数百万字段的表单,十分之一. ..左右,我需要解雇键盘). (8认同)
  • 这对我来说非常有效,并且肯定比这个问题的其他一些答案更可取.文档说它可以在iOS 2.0及更高版本中使用. (3认同)

Nic*_*ley 126

您可以强制当前编辑的视图重新调整其第一个响应者状态[view endEditing:YES].这隐藏了键盘.

不同的是-[UIResponder resignFirstResponder],-[UIView endEditing:]将搜索子视图以查找当前的第一响应者.所以你可以把它发送到你的顶级视图(例如self.view在a UIViewController),它会做正确的事情.

(这个答案以前包含了其他一些解决方案,这些解决方案也有效,但比必要的更复杂.我已将其删除以避免混淆.)

  • 这已经过时了.`[self.view endEditing:YES];`答案更好. (3认同)

Tra*_*Man 91

您可以向应用程序发送零目标操作,它将随时辞职第一响应者,而无需担心哪个视图当前具有第一响应者状态.

Objective-C的:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
Run Code Online (Sandbox Code Playgroud)

Swift 3.0:

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
Run Code Online (Sandbox Code Playgroud)

NOS目标操作在Mac OS X上常用于菜单命令,这里是iOS上的用途.

  • 整个页面的最佳解决方案. (14认同)
  • 仍然适用于iOS 8,面向iOS 7. (2认同)

小智 56

说实话,我并不为这里提出的任何解决方案而疯狂.我确实找到了一种使用TapGestureRecognizer的好方法,我认为它可以解决问题的核心:当你点击键盘以外的任何东西时,关掉键盘.

  1. 在viewDidLoad中,注册以接收键盘通知并创建UITapGestureRecognizer:

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    
    [nc addObserver:self selector:@selector(keyboardWillShow:) name:
    UIKeyboardWillShowNotification object:nil];
    
    [nc addObserver:self selector:@selector(keyboardWillHide:) name:
    UIKeyboardWillHideNotification object:nil];
    
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
    action:@selector(didTapAnywhere:)];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加键盘显示/隐藏响应者.在那里你添加和删除TapGestureRecognizer到UIView,它应该在点击时解除键盘.注意:您不必将其添加到所有子视图或控件.

    -(void) keyboardWillShow:(NSNotification *) note {
        [self.view addGestureRecognizer:tapRecognizer];
    }
    
    -(void) keyboardWillHide:(NSNotification *) note
    {
        [self.view removeGestureRecognizer:tapRecognizer];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. TapGestureRecognizer会在点击时调用您的函数,您可以像这样关闭键盘:

    -(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {    
        [textField resignFirstResponder];
    }
    
    Run Code Online (Sandbox Code Playgroud)

这个解决方案的好处是它只过滤Taps,而不是滑动.因此,如果您在键盘上方滚动内容,则滑动仍会滚动并显示键盘.通过在键盘消失后移除手势识别器,可以正常处理视图上的未来点击.


pra*_*ash 22

这是一个解决方案,通过在一个地方添加代码使键盘return任何文本字段中被击中时消失(因此不必为每个文本字段添加处理程序):


考虑这种情况:

我有viewcontroller两个文本字段(用户名和密码).和viewcontroller实现UITextFieldDelegate协议

我在viewDidLoad中这样做

- (void)viewDidLoad 
{
    [super viewDidLoad];

    username.delegate = self;
    password.delegate = self;
}
Run Code Online (Sandbox Code Playgroud)

并且viewcontroller将可选方法实现为

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

无论你在哪个文本区域,只要我按下return键盘,它就会被解雇!

在你的情况下,只要你将所有textfield的委托设置为self并实现,它就会起作用 textFieldShouldReturn


Ken*_*ner 14

更好的方法是让某些东西"窃取"第一响应者状态.

由于UIApplication是UIResponder的子类,您可以尝试:

[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]
Run Code Online (Sandbox Code Playgroud)

如果做不到这一点,创建一个具有零大小框架的新UITextField,将其添加到某个地方的视图并执行类似的操作(之后再进行重新签名).

  • 他们不会,看到最好的解决方案,以获得更好的解决方案.它当时并不为人所熟知(我的答案来自2009年,另一个答案是在一年多后的2010年).但我把它留给子孙后代. (2认同)

lor*_*ean 7

把它放在一些实用类中.

+ (void)dismissKeyboard {
    [self globalResignFirstResponder];
}

+ (void) globalResignFirstResponder {
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    for (UIView * view in [window subviews]){
        [self globalResignFirstResponderRec:view];
    }
}

+ (void) globalResignFirstResponderRec:(UIView*) view {
    if ([view respondsToSelector:@selector(resignFirstResponder)]){
        [view resignFirstResponder];
    }
    for (UIView * subview in [view subviews]){
        [self globalResignFirstResponderRec:subview];
    }
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*emy 6

@Nicholas Riley和@Kendall Helmstetter Geln&@cannyboy:

绝对精彩!

谢谢.

在这个帖子中考虑你的建议和其他人的建议,这就是我所做的:

使用时的样子:

[[self appDelegate] dismissKeyboard]; (注意:我添加了appDelegate作为NSObject的补充,所以我可以在任何地方使用任何东西)

引擎盖下的样子:

- (void)dismissKeyboard 
{
    UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
    tempTextField.enabled = NO;
    [myRootViewController.view addSubview:tempTextField];
    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
}
Run Code Online (Sandbox Code Playgroud)

编辑

修改我的答案包括在内tempTextField.enabled = NO;.禁用文本字段将防止UIKeyboardWillShowNotificationUIKeyboardWillHideNotification被发送键盘的通知你应该依靠这些通知在您的应用程序.


小智 5

关于用户在UITextField或键盘之外的屏幕上的任意位置触摸时如何关闭iOS中的键盘的快速提示。考虑到iOS键盘会占用多少空间,采用一种简单直观的方式让用户关闭键盘是很有意义的。

这是一个链接


小智 5

这里有很多过于复杂的答案,也许是因为这在iOS文档中并不容易找到.约瑟夫H就在上面:

[[view window] endEditing:YES];
Run Code Online (Sandbox Code Playgroud)


小智 5

比 Meagar 的答案还要简单

覆盖touchesBegan:withEvent:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [textField resignFirstResponder];`
}
Run Code Online (Sandbox Code Playgroud)

dismiss the keyboard当您触摸 中的任何位置时都会出现此情况background


Tak*_*ide 5

这是我在代码中使用的内容。它就像一个魅力!

在 yourviewcontroller.h 添加:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

现在在 .m 文件中,将其添加到您的 ViewDidLoad 函数中:

- (void)viewDidLoad {
    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}
Run Code Online (Sandbox Code Playgroud)

此外,在 .m 文件中添加此函数:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}
Run Code Online (Sandbox Code Playgroud)