触摸 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];
现在如果背景或标签被触摸,这会关闭键盘。
但是如果UISegmentedControl
或datepicker
被触摸,我该如何关闭键盘?
【问题讨论】:
@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];
对于UISegmentedControl
或UIDatePicker
,您可能有自己的选择器方法,例如:
对于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 时如何关闭键盘?的主要内容,如果未能解决你的问题,请参考以下文章