如何通过点击任何地方消除数字键盘的键盘
我想知道最简单的代码,以便在数字键盘外部任何地方轻点数字键盘键盘。 这是一个简单的应用程序,在文本字段中input数字,然后用户可以在用户完成在文本字段上input数字后closures键盘。 谢谢! 🙂
声明文本字段为实例variables或属性,如果它尚未实现一个简单的方法,如下所示:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [textField resignFirstResponder]; }
会做得很好。
试试这个方法,
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; }
现在点击任何地方,看到键盘将消失。 🙂
在Swift中使用代码
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { textFiled.resignFirstResponder() }
查看以下链接的最新更新
触摸背景来closures键盘
如果你不在那里,请转到Xcode。 我们需要再添加一个动作到我们的控制器类。 将下面的行添加到Control_FunViewController.h文件中:
#import <UIKit/UIKit.h> @interface Control_FunViewController : UIViewController { UITextField *nameField; UITextField *numberField; } @property (nonatomic, retain) IBOutlet UITextField *nameField; ] @property (nonatomic, retain) IBOutlet UITextField *numberField; - (IBAction)textFieldDoneEditing:(id)sender; - (IBAction)backgroundTap:(id)sender; @end
保存头文件; 切换到实现文件,并添加这个代码,它只是告诉两个文本字段,如果他们有第一个响应者的状态。 在不是第一响应者的控件上调用resignFirstResponder是完全安全的,所以我们可以安全地在两个文本字段上调用它,而不必检查是否是第一响应者。
- (IBAction)backgroundTap:(id)sender { [nameField resignFirstResponder]; [numberField resignFirstResponder]; }
提示保存此文件,然后返回到Interface Builder。 我们现在需要改变我们的笔尖视图的基础类。 如果您查看笔尖的主窗口,您会看到该视图中有三个图标。 第三个叫View的是我们的笔尖的主视图,它把所有其他的控件和视图当作子视图。 单击一个名为View的图标,代表我们的笔尖的容器视图。 按␣4调出身份validation员。 这是我们可以在Interface Builder中更改任何对象实例的基础类的地方。
在编写代码时,您将在头文件和实现文件之间切换。 幸运的是,Xcode有一个组合键,可以快速切换这些文件。 默认的组合键是␣␣␣(选项 – 向上箭头),尽pipe您可以使用Xcode的首选项将其更改为任何您想要的内容。
目前标记为Class的字段表示UIView。 将其更改为读取UIControl。 所有能够触发动作方法的控件都是UIControl的子类,所以通过改变底层类,我们给了这个视图触发动作方法的能力。 您可以通过按␣2来调出连接检查器来validation。
从Touch Down事件拖动到File's Owner图标,然后selectbackgroundTap:操作。 现在,触摸视图中的任何地方没有一个主动控制将触发我们的新的行动方法,这将导致键盘收回。
注意保存笔尖,让我们回去尝试一下。 编译并再次运行您的应用程序。 这一次,键盘应该不仅在完成button被点击时消失,而且当你点击任何不是活动控件的地方,这是用户期望的行为。
我试着在这里实施一些解决scheme,发现他们有一些问题。 值得注意的是,我的UIView
包含一个UIScrollView
,它似乎拦截触摸。
当失败的时候,我认为“随处窃听”有一点不确定的行为,要求用户猜测如何解除键盘而不是给他们明确的指导。
此外,我在应用程序中显示的每个其他键盘上都有一个“返回”或“完成”button,所以我决定给用户一个简单,直观,明确指定的方式,用数字键盘来清除键盘符合使用中的其他键盘解除机制。
我意识到这不是OP特别要求的内容,但我相信这是一个比“轻点任何地方”的要求更好的解决scheme(而且很容易实现!)。
以下代码在我的UIViewController
作为-viewDidLoad
一部分被调用。
// My app is restricted to portrait-only, so the following works UIToolbar *numberPadAccessoryInputView = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44.0f)]; // My app-wide tint color is a gold-ish color, so darkGray contrasts nicely numberPadAccessoryInputView.barTintColor = [UIColor darkGrayColor]; // A basic "Done" button, that calls [self.textField resignFirstResponder] UIBarButtonItem *numberPadDoneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self.textField action:@selector(resignFirstResponder)]; // It's the only item in the UIToolbar's items array numberPadAccessoryInputView.items = @[numberPadDoneButton]; // In case the background of the view is similar to [UIColor darkGrayColor], this // is put as a contrasting edge line at the top of the UIToolbar UIView *topBorderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, numberPadAccessoryInputView.frame.size.width, 1.0f)]; topBorderView.backgroundColor = [UIColor whiteColor]; [numberPadAccessoryInputView addSubview:topBorderView]; // Make it so that this UITextField shows the UIToolbar self.textField.inputAccessoryView = numberPadAccessoryInputView;
这样,键盘上方就会有一个非常漂亮的直观控件,可以清楚地显示用户在完成文本input时应如何进行操作。
我仍然相信苹果应该为这个键盘提供一个“完成”button(如Janak Nirmal发布的链接),但是这是对我来说最优雅的非Apple解决scheme。
您必须使用UITapGestureRecognizer来实现这一点。
UITapGestureRecognizer *tapToDismiss = [[UITapGestureRecognizer alloc]initWithTarget: self action: @selector (dismissNumberKeyBoard:)];
然后在你的dismissNumberKeyboard方法中,
-(Void)dismissNumberKeyboard : (id)sender { [yourTextField resignFirstResponder]; }
快乐的编码!
只是做一个这样的简单function..
-(IBAction)hideKeyboard:(id)Sender { [_textValue resignFirstResponder]; }
现在去你的笔尖文件,并用didEndOnExit
连接这个函数与文本didEndOnExit
,你很好去。 现在,当你将点击你的文本字段以外的键盘将隐藏自己。
通常情况下,当用户触摸“取消”button,我用这个来解除键盘 –
- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar { NSLog(@"cancel clicked"); [searchBar resignFirstResponder]; // dismiss keyboard return; }
如果你想这样做,当用户触摸键盘区域以外的任何地方,那么你需要实现touchesEnded
并把这个代码 –
/* Delegate for when touch ends. */ -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [searchBar resignFirstResponder]; }
我自己也没有尝试过这个,但我认为这应该做的伎俩… … –
我必须为我的UITableView实现一个类似的用户体验(内部出现一个UITextField)。 首先,将一个UITapGestureRecognizer
添加到tableView。 这将开始抓住从现在开始的所有水龙头。
UITapGestureRecognizer* tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; [self.tableView addGestureRecognizer:tapGestureRecognizer]; [tapGestureRecognizer release];
然而,副作用是,当用户点击UITextField本身时,您不想closures键盘。 所以,这个案件必须加以区分。
handleTap方法的实现看起来像这样 –
/* In the text editing mode, listens to all taps occurring on the table view to exit the mode. There are two special cases to consider: a) Text field's clear button b) Text field */ -(void)handleTap:(UITapGestureRecognizer*)tapRecognizer { if(tapRecognizer.state == UIGestureRecognizerStateEnded) { //Figure out where the user tapped CGPoint p = [tapRecognizer locationInView:textField]; CGRect textFieldBounds = textField.bounds; CGRect clearButtonBounds = CGRectMake(textFieldBounds.origin.x + textFieldBounds.size.width - 44, textFieldBounds.origin.y, 44, textFieldBounds.size.height); if(CGRectContainsPoint(clearButtonBounds, p)) textField.text = @""; if(CGRectContainsPoint(textFieldBounds, p)) return; [textField resignFirstResponder]; //remove the tap gesture recognizer that was added. for(id element in self.tableView.gestureRecognizers) { if([element isKindOfClass:[UITapGestureRecognizer class]]) { [self.tableView removeGestureRecognizer:element]; } } } [self commitNewText]; } }
HTH。 如果你喜欢的话,将其标记为答案。
-Akshay
如果你已经做了一个自定义的数字键盘或其他popup窗口,另一个解决scheme是在你的UIView的init中使用一个手势识别器,像这样:
tapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; tapper.cancelsTouchesInView = NO; [self addGestureRecognizer:tapper]; _yourViewController = [[CustomViewController alloc] init]; _yourPopoverController = [[UIPopoverController alloc] initWithContentViewController:_yourViewController]; _yourPopoverController.popoverContentSize = CGSizeMake(550, 300); _yourViewController.delegate = self;
如果可见,请使用handleSingleTapclosurespopup窗口,并closures编辑:
- (void)handleSingleTap:(UITapGestureRecognizer *) sender { if ([_yourPopoverController isPopoverVisible]) { [_yourPopoverController dismissPopoverAnimated:YES]; } [self endEditing:YES]; }
在xcode 5中使用轻触手势识别器,并在.h中用动作声明select一个名称,并在.m中
- (IBAction)backgroundTap:(id)sender { [self.view endEditing: YES]; }
这里有很多答案,但仍然不得不使用XCode 5来解决这个问题。阅读: https : //developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html
添加一个轻拍手势识别器到你的UIScrollView。 将其委托设置为viewcontroller。
添加这个方法:
- (IBAction)tappedSomewhere:(id)sender { [self.view endEditing:YES]; }
到您的UIScrollView实现代码,并通过控制点击并拖动到实现代码将其关联到“点击手势识别器”。
为我工作。
对于Swift来说,最简单的方法是通过在文本字段之外的任意位置点击来解除所有文本字段的键盘:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { self.view.endEditing(true) }
你可以很好地实现@ didSet
的答案,把didSet
放在sockets上,并在那里附上你的inputAccessoryView:
SWIFT代码:
@IBOutlet var input: UITextField! { didSet { let toolbar = UIToolbar(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 0, height: 44))) toolbar.items = [ UIBarButtonItem(barButtonSystemItem: .done, target: self.input, action: #selector(resignFirstResponder)) ] input.inputAccessoryView = toolbar }}
在Xcode 8 / iOS 10中,它看起来像这样: