我想知道如何使键盘消失时,用户触摸以外的UITextField。


当前回答

我认为最简单(最好)的方法是子类化全局视图,并使用hitTest:withEvent方法来监听任何触摸。键盘上的触摸没有注册,所以hitTest:withEvent只在你触摸/滚动/滑动/捏…然后调用[self - ending:YES]。

这比使用touchesBegan要好,因为如果你点击视图顶部的按钮,touchesBegan不会被调用。它比无法识别滚动手势的UITapGestureRecognizer更好。它也比使用暗屏更好,因为在复杂和动态的用户界面中,你不能到处都放暗屏。此外,它不会阻止其他动作,你不需要点击两次来选择外面的按钮(就像在UIPopover的情况下)。

此外,这比调用[textField resignFirstResponder]更好,因为你可能在屏幕上有许多文本字段,所以这适用于所有的文本字段。

其他回答

你可以在XCode 6及以上版本中使用Storyboard:

创建隐藏键盘的动作

将这个添加到ViewController使用的类的头文件中:

@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>

- (IBAction)dissmissKeyboardOnTap:(id)sender;

@end

然后将这个添加到同一个ViewController的实现文件中:

- (IBAction)dissmissKeyboardOnTap:(id)sender{
    [[self view]endEditing:YES];
}

这将是你的故事板场景(即ViewController)的“Received Actions”之一:

将操作连接到用户事件

现在,您需要将这个动作与触碰键盘的用户手势连接起来。

重要-你需要将包含在故事板中的“UIView”转换为UIControl,这样它就可以接收事件。从视图控制器场景层次结构中选择视图:

...并更改其类:

现在从你的场景的“received action”旁边的小圆圈拖到你的场景的“空”部分(实际上你是在把“received action”拖到UIControl上)。你会看到一个事件的选择,你可以连接你的行动:

选择“touch up inside”选项。现在,您已经将创建的IBAction连接到触碰键盘的用户操作。当用户点击键盘时,它将被隐藏。

(注意:要将动作与事件挂钩,你也可以从接收到的动作直接拖到视图控制器层次结构中的UIControl上。它在层次结构中显示为“Control”。)

这一定是通过触摸外部隐藏键盘的最简单方法:

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

(从如何解散键盘时,用户点击其他区域以外的文本框?)

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch = touches.first{
     view.endEditing(true)

     }
}

在swift 5中,你可以使用以下代码来解除文本域外的键盘

override func viewDidLoad() {
    // ... code

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard(_:)))
    self.view.addGestureRecognizer(tapGesture)  
}

@objc func dismissKeyboard(_ sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}

我拼凑了几个答案。

使用一个在viewDidLoad期间初始化的ivar:

UIGestureRecognizer *tapper;

- (void)viewDidLoad
{
    [super viewDidLoad];
    tapper = [[UITapGestureRecognizer alloc]
                initWithTarget:self action:@selector(handleSingleTap:)];
    tapper.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapper];
}

删除当前正在编辑的内容:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}