【问题标题】:how to hide the keyboard when empty area is touched on iphone如何在iphone上触摸空白区域时隐藏键盘
【发布时间】:2010-10-22 17:14:39
【问题描述】:

通常当你触摸文本输入区域时,键盘会弹出,当你触摸屏幕的空白区域时,键盘会消失。如何做到这一点?

就像我们在 iphone safari 上所经历的......

谢谢

【问题讨论】:

    标签: iphone iphone-softkeyboard


    【解决方案1】:

    更新方式(推荐):

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    {
       [self.view endEditing:YES];
    }
    

    这将结束对所有子视图的编辑并辞去第一响应者的职务。

    其他方式(枚举所有文本视图):

    这是一步一步的:

    给你的视图控制器添加一个 IBAction,比如 - (IBAction)backgroundTouch:(id)sender

    在 backgroundTouch 操作中,您需要将 resignFirstResponder 消息发送到视图中的所有文本框。这是不幸的,但这是必要的,因为目前无法检索当前具有 FirstResponder 状态的对象。它应该看起来像这样:

    - (IBAction)backgroundTouch:(id)sender {
      [someTextBox resignFirstResponder];
      [anotherTextBox resignFirstResponder];
    }
    

    向视图添加一个按钮控件,将其调整大小以覆盖整个可见区域(状态栏或任何选项卡或导航控制器除外)。选择 按钮,然后转到布局菜单并选择发送到后面。还将按钮的类型设置为自定义,如果您没有专门为其提供任何绘图代码,则该按钮是不可见的。

    将 Button 的 Touch Up Inside 事件连接到 backgroundTouch: 动作并尝试一下。

    【讨论】:

    • 在另一篇文章中找到的捷径:[self.view endEditing:YES];将结束所有子视图中的编辑并辞去第一响应者的职务。它比枚举所有文本框要清晰得多,并且在您以后添加字段时不会中断!
    • 感谢 HitScan 的详细说明,非常感谢 Peter 与我们分享快捷方式!!
    • 在第一个解决方案中,touchesBegan:withEvent: 不应该调用[super touchesBegan:touches withEvent:event]
    【解决方案2】:

    使用这个简单的解决方案

    对于 Swift 4:

       override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            self.view.endEditing(true)
       }
    

    对于 Swift 2:

        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            self.view.endEditing(true)
        }
    

    对于目标 C:

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    {
       [self.view endEditing:YES];
    }  
    

    适用于 UITextField、UITextView 和所有子视图。

    【讨论】:

    • 简单优雅的解决方案.. 像魅力一样工作!
    • 我该如何使用它?我有一个 ViewController 但它从未被调用过。那么我是否必须继承 UIView 并覆盖此方法,然后在 IB 中查看此子类?
    • @Rob 只需在 viewcontroller.m 中添加您的代码,无需与视图链接。它应该工作
    • 在整个网络中,这是唯一没有错误的解决方案(大多数其他解决方案会导致按钮与不调用其选择器的按钮发生冲突)并且它们之间最优雅,我向你致敬
    【解决方案3】:

    忘记在后台放一个按钮简单的解决方案

    (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        [self.textfieldName resignFirstResponder];
    }
    

    【讨论】:

    • 这是一个比这个问题的最佳答案更干净的解决方案!
    • 谢谢你!像魅力一样工作!
    • 如果文本字段位于 tableViewCell 中,我该如何进行这项工作?
    【解决方案4】:

    here上有一个关于这个问题的教程(也关于没有 DONE 键的数字键盘)

    【讨论】:

      【解决方案5】:

      对于 > iOS 4.0,还有另一种解决方案(也许更好) 使用此代码,在视图中的任意位置单击即可隐藏键盘。

      // single tap to resign keyboard
      UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithBlock:^(UIGestureRecognizer *rec){
                  [input_text resignFirstResponder];
              }];
      self.singleTapRecognizer.numberOfTapsRequired = 1;
      self.singleTapRecognizer.cancelsTouchesInView = NO;
      [self.view addGestureRecognizer:singleTapRecognizer];
      

      【讨论】:

        【解决方案6】:

        向控件发送resignFirstResponder

        【讨论】:

          【解决方案7】:

          以下代码适用于 xamarin iOS 项目:

          public override void TouchesBegan (NSSet touches, UIEvent evt){
              View.EndEditing (true);
          }
          

          【讨论】:

            【解决方案8】:

            你也可以这样做

            通过在视图中触摸背景来隐藏键盘

            - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
                [[self view] endEditing:YES];
            }
            

            【讨论】:

              【解决方案9】:

              我也遇到了这个问题,很烦。但我想出了如何在意外中摆脱键盘。假设您正在给 John 发短信,并且有一个键盘妨碍您查看对话,因此减少了您可以看到的屏幕。然后点击左上角的消息,然后选择另一个你有发短信记录的人,然后再次点击左上角的消息。然后返回并选择 John。不,你又回到了与约翰的对话中,键盘不见了。接缝很多,但速度很快。你会认为他们只是在键盘上放了一个隐藏按钮哈哈希望有帮助,或者足够清楚。

              【讨论】:

                【解决方案10】:

                我无法使用 'initWithBlock:' 选择器编译上述 Val 的答案。

                此代码对我有用。将此添加到定义视图的方法中 - 请注意,我的视图是组合的,我想要响应单击的子视图是“chatView”。使用键盘的输入字段视图名为“chatInput”。

                    // single tap to resign (hide) the keyboard
                    UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
                    singleTapRecognizer.numberOfTouchesRequired = 1;
                    singleTapRecognizer.cancelsTouchesInView = NO;
                    [chatContent addGestureRecognizer:singleTapRecognizer];
                

                然后添加点击处理方法。

                /**
                 * Handles a recognized single tap gesture.
                 */
                - (void) handleTapFrom: (UITapGestureRecognizer *) recognizer {
                    // hide the keyboard
                    NSLog(@"hiding the keyboard");
                    [chatInput resignFirstResponder]; 
                }
                

                【讨论】:

                  【解决方案11】:

                  如果您使用 swift 和 iOS 8/9,此解决方案应该可以正常工作:

                      override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
                           self.view.endEditing(true)
                      }
                  

                  【讨论】:

                    猜你喜欢
                    • 2011-12-23
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-12-31
                    • 2013-06-02
                    • 1970-01-01
                    • 2013-01-22
                    • 2013-09-30
                    • 2015-01-06
                    相关资源
                    最近更新 更多