【问题标题】:How do I dismiss the iOS keyboard?如何关闭 iOS 键盘?
【发布时间】:2011-10-17 21:17:42
【问题描述】:

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

【问题讨论】:

标签: ios keyboard


【解决方案1】:

作为最后的手段?

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

【讨论】:

  • 我有一个 UI,其中有一个 UITextField,它是第一响应者,但显示建议的弹出窗口也处于活动状态。用隐藏按钮关闭键盘并没有以某种方式隐藏键盘。这段代码在这里帮助了我,谢谢! :)
【解决方案2】:
[myTextField resignFirstResponder]

Here,显示和隐藏键盘部分的第二段。

【讨论】:

    【解决方案3】:

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

    UIApplication.shared.keyWindow?.endEditing(true)
    

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

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

    【讨论】:

      【解决方案4】:

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

      ObjC

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

      【讨论】:

      • 正是我想要的!
      【解决方案5】:

      3 个简单快速的步骤

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

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

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

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

      最后一步,在适当的地方将您的 UITextField(s) 委托设置为 self。比如viewDidLoad函数内部:

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

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

      我也准备了一个例子sn-p,你可以从here查看。

      【讨论】:

        【解决方案6】:

        对于 Swift 3

        你可以像这样隐藏键盘:

        textField.resignFirstResponder()
        

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

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

        【讨论】:

          【解决方案7】:
          1. 在 Xcode 中设置“Did End On Exit”事件(右键单击您的文本字段)。

          2. 实现这个方法:

            -(IBAction) closeKeyboard:(id) sender {
                [_txtField resignFirstResponder];
            }
            

          【讨论】:

            【解决方案8】:

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

            // Swift
            TextField.resignFirstResponder()
            
            // Objective C
            [TextField resignFirstResponder];
            

            要退出任何文本字段,请使用以下代码

            // Swift
            self.view!.endEditing(true)
            
            // Objective C
            [self.view endEditing:YES];
            

            【讨论】:

              【解决方案9】:
              -(void)textFieldDidBeginEditing:(UITextField *)textField
              {
                  // your code
              
                  [textField reloadInputViews];
              }
              

              【讨论】:

                【解决方案10】:

                如果您有多个文本字段并且不知道哪个是第一响应者(或者您根本无法从编写此代码的任何位置访问文本字段),您可以在父视图上调用 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 要好得多,但由于某种原因,直到最近我才发现它。

                【讨论】:

                • 该死!我不敢相信我刚刚被代码注释弄得一团糟。
                • @Lytol rickrolling(又名 bait-and-switch)的目的是用谎言诱骗人们,然后将他们重定向到唱歌“Never gonna tell a lie”的人,所以我们不会在最轻微的(因为没有谎言,这只是一个很好玩笑的答案)。
                【解决方案11】:

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

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

                1. 以编程方式将 ABPersonViewController 推送到屏幕上;打开任何联系人;
                2. 触摸“note”字段(成为第一响应者并启动键盘);
                3. 在任何其他字段上向左滑动以显示“删除”按钮;
                4. 此时您在文本字段中没有第一响应者(只需以编程方式检查),但键盘仍然存在。调用 [view endEditing:YES] 什么都不做。

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

                [viewController setEditing:NO animated:YES];
                

                【讨论】:

                  【解决方案12】:

                  在您的视图控制器 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];
                  }
                  

                  【讨论】:

                    【解决方案13】:

                    如果您不知道哪个 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]);
                    

                    【讨论】:

                      【解决方案14】:
                      -(void)methodName
                      {
                          [textFieldName resignFirstResponder];
                      }
                      

                      用 didEndOnExit 调用这个方法(methodName)

                      【讨论】:

                        【解决方案15】:

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

                        [yourTextFieldName resignFirstResponder];
                        

                        【讨论】:

                          【解决方案16】:

                          我建议你在你的头文件上添加和操作:

                          -(IBAction)removeKeyboard;
                          

                          在实现中,这样写:

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

                          在 NIB 文件中,从 UITextFiled 连接到选项 DidEndOnExit 上的文件所有者。这样,当你按下回车键时,键盘就会消失。

                          希望对你有帮助!

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2014-10-10
                            • 2015-12-19
                            • 1970-01-01
                            • 1970-01-01
                            • 2011-11-28
                            • 2017-08-28
                            • 1970-01-01
                            • 2014-07-02
                            相关资源
                            最近更新 更多