触摸 UIControl 时如何关闭键盘?

Posted

技术标签:

【中文标题】触摸 UIControl 时如何关闭键盘?【英文标题】:How to dismiss keyboard when an UIControl is touched? 【发布时间】:2014-01-25 13:26:53 【问题描述】:

这个问题已经问了好几次了,但我好像没明白。

我有一个视图控制器,有两个文本字段、一个分段控件、一个日期选择器和一些标签。

当用户单击背景或分段控件或日期选择器时,我想关闭键盘。 这是我的.h 文件:

@interface MRPatientenViewController : UIViewController
@property (nonatomic, strong) MRPatientenTableViewController *delegate;
- (IBAction)textFieldReturn:(id)sender;
@property (strong, nonatomic) IBOutlet UITextField *nachnameTextField;
@property (strong, nonatomic) IBOutlet UITextField *vornameTextField;
@property (strong, nonatomic) IBOutlet UIDatePicker *geburtsdatumPicker;
@property (strong, nonatomic) IBOutlet UISegmentedControl *genderSegmentedControl;
@end

这是我的.m 文件:

-(IBAction)textFieldReturn:(id)sender
[sender resignFirstResponder];


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
UITouch *touch = [[event allTouches] anyObject];
if ([_nachnameTextField isFirstResponder] && [touch view] != _nachnameTextField) 
    [_nachnameTextField resignFirstResponder];
 
else if ([_vornameTextField isFirstResponder] && [touch view] != _vornameTextField) 
    [_vornameTextField resignFirstResponder];

[super touchesBegan:touches withEvent:event];

现在如果背景或标签被触摸,这会关闭键盘。

但是如果UISegmentedControldatepicker 被触摸,我该如何关闭键盘?

【问题讨论】:

@embert:感谢您编辑我发布的代码,所以它读起来很好:) 【参考方案1】:

您的触摸代码是正确的,但它在我的代码中也可以正常工作。当您点击文本字段外部时,触摸事件调用但其内部条件无法正常工作。我删除条件并检查其工作正常。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    [nachnameTextField resignFirstResponder];
    [super touchesBegan:touches withEvent:event];

【讨论】:

没用。问题是它适用于背景和标签(或任何 UIView)上的点击,但不适用于日期选择器或 UISegmentedControl(或可能任何 UIControl)上的点击【参考方案2】:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[geburtsdatumPicker addGestureRecognizer:tap];
[genderSegmentedControl addGestureRecognizer:tap];
[self.view addGestureRecognizer:tap];

然后在选择器内退出键盘

-(void) dismissKeyboard

    [nachnameTextField resignFirstResponder];
    [vornameTextField resignFirstResponder];

【讨论】:

我是 ios 新手(来自 android)。 “然后在选择器中退出键盘”是什么意思? 这意味着隐藏键盘取决于哪个字段有焦点;) 啊,好吧,我仍然必须习惯“选择器”这个术语的方法 ;)... 但是选择器是如何连接的或者谁调用了“-(void)dismissKeyboard”?我错过了那件......?【参考方案3】:

您是否尝试过以下代码行

[textfieldInFocus resignFirstResponder];

【讨论】:

这会隐藏键盘。但我在问如何捕获其他 UIControls 的点击事件。【参考方案4】:

您可以执行以下操作:

UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction)];
tapGesture.delegate=self;
[self.view addGestureRecognizer:tapGesture];

- (void)tapAction

    [nachnameTextField resignFirstResponder];
    [vornameTextField resignFirstResponder];

对于UISegmentedControlUIDatePicker,您可能有自己的选择器方法,例如: 对于UISegmentedControl

- (IBAction)mainSegmentControl:(UISegmentedControl *)segment

UIDatePicker

- (void)changeDate:(UIDatePicker *)sender 

只需在上述两种方法中调用您的方法[self tapAction];,您就可以开始了...!!

【讨论】:

对我不起作用。点击 UISegmentedControl 只会隐藏键盘,当控件改变值时。【参考方案5】:

这是对我有用的解决方案:MRViewController.h 文件:

#import <UIKit/UIKit.h>
@interface MRViewController : UIViewController <UITextFieldDelegate>
@property (strong, nonatomic) IBOutlet UITextField *textField;
@property (strong, nonatomic) IBOutlet UISegmentedControl *segmentedControl;
@end

MRViewController.m 文件:

- (void)viewDidLoad

    [super viewDidLoad];
    [self hideKeyboardWhenBackgroundIsTapped];
    self.textField.delegate = self;

-(void)hideKeyboardWhenBackgroundIsTapped
    UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
    [tgr setCancelsTouchesInView:NO];
    [self.view addGestureRecognizer:tgr];

-(void)hideKeyboard
    [self.view endEditing:YES];

在我的故事板场景中,我得到了一个 UITextField 和一个 UISegmentedControl。

【讨论】:

以上是关于触摸 UIControl 时如何关闭键盘?的主要内容,如果未能解决你的问题,请参考以下文章

UIControl 跟踪在不同 UIControl 上开始的触摸

突出显示时如何更改 UIControl 的大小?

在不添加完成键的情况下关闭数字键盘式键盘

触摸整个应用程序时如何关闭键盘

在文本字段外触摸时如何关闭键盘?

当用户触摸视图时关闭键盘