当你有多个UITextFields时,是否可以关闭键盘? 如果是这样,如何?
作为旁注,我是否必须关闭每个字段的键盘,或者它可以全局完成? 哦,如果我不必触摸 DONE 按钮,那会非常酷,理想情况下,我想要一个解决方案,即用户触摸除相关字段之外的任何内容并且键盘自动消失......
哦,如果你能这么好心一步一步地说明。
我应该补充一点,我已经有一种方法可以退出键盘......
但是,它仅在提交表单时运行!(见下面的方法(
我的问题是如何隐藏/关闭键盘而不必跳过这么多该死的箍!你会认为 6 年后,一个成熟的操作系统将有办法全局隐藏键盘......不!
好了,抱怨够了。
- (void)hideKeyboard {
[self.dancePlace resignFirstResponder];
[self.danceGate resignFirstResponder];
[self.danceTerminal resignFirstResponder];
[self.danceText resignFirstResponder];
[self.danceDate resignFirstResponder];
[self.danceStyle resignFirstResponder];
[self.danceTimeOut resignFirstResponder];
}
当我的按钮被提交时,这被称为....
- (IBAction)addListingPressed:(id)sender {
// NSLog(@"BUTTON PRESSED");
[self hideKeyboard];
[self valuesAdded];
}
我的问题,假设任何人都可以回答这个问题...我怀疑不是,如果满足以下条件,有没有办法全局隐藏键盘:1.( 用户点击任何一个现有字段,2.( 按屏幕上的任何其他位置。3.( 在现有 viewcontroller.m 文件中不超过一两行。 4.(我不必在视图控制器上添加令人困惑的按钮。(每当我必须添加插座时,该死的东西都会撞到我身上......然后肮脏的事情发生了,真的...请记住,我只是一个初学者,读到我必须把这个放在这里和那个那里,这很令人困惑......哎呀。 简单的人,简单。 我不是在寻找优雅的解决方案,只是为了让它起作用。
我有一个所有视图控制器都继承的超类。 在那个类中,我有这个代码。
MySuperViewController.h
#import <UIKit/UIKit.h>
@interface MySuperViewController : UIViewController
@property(strong, nonatomic) UITapGestureRecognizer *backgroundTapGestureRecognizer;
@end
MySuperViewController.m
- (void)viewDidLoad{
//add a tap gesture recognizer to capture all tap events
//this will include tap events when a user clicks off of a textfield
self.backgroundTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onBackgroundTap:)];
self.backgroundTapGestureRecognizer.numberOfTapsRequired = 1;
self.backgroundTapGestureRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:self.backgroundTapGestureRecognizer];
}
- (void)onBackgroundTap:(id)sender{
//when the tap gesture recognizer gets an event, it calls endEditing on the view controller's view
//this should dismiss the keyboard
[[self view] endEditing:YES];
}
我有 UITapGestureRecognizer 作为公共属性,因此如果需要,我可以重写它。
亚纲
MyViewController.h
#import <UIKit/UIKit.h>
#import "MySuperViewController.h"
@interface MyViewController : MySuperViewController<UIGestureRecognizerDelegate>
@end
MyViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//You don't always want the keyboard to be dismissed, so you tie into the gesture recognizer's delegate method
//By doing this, you can stop the endEditing call from being made
[self.backgroundTapGestureRecognizer setDelegate:self];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
//touch.view is the view that recieved the touch
//if this view is another textfield or maybe a button, you can return NO and the endEditing call won't be made
if (touch.view == self.myViewThatShouldNotBeBlocked) {
return NO;
}
//if you want the gesture recognizer to accept the event, return yest
return YES;
}
我上传了一个示例项目到github。https://github.com/JeffRegan/KeyboardBeGone
RDVKeyboardVoiding是一个带有点击手势识别器的滚动视图,专为多个textViews/textFields而设计。它跟踪活动视图并删除大量样板代码。
点击文本字段之外的任意位置..它将隐藏它。
[self.view endEditing:YES];
还有其他几种方法可以做到这一点。
[myEditField resignFirstResponder];
[myEditField endEditing];
[parentView endEditing];
如果你不打算做那么多事情,只是想关闭键盘,而不是给你的每个文本提交到以下方法的 iboutlet..
-(IBAction)hidekeyboard:(id)sender
{
[sender resignFirstResponder];
}
是的,您只需为当前正在编辑的那个关闭它。
为了知道正在编辑哪一个,您可以检查 -(BOOL)isFirstResponder
属性,如果它是第一个响应者(正在编辑的响应者(,它将返回 YES,如果不是,则返回 NO。一旦你知道哪一个是第一响应者,你就可以打电话给-(void)resignFirstResponder
来摆脱键盘。
例如,如果您有一个名为 -(void)aMethod
的方法,并且您想要关闭当前视图控制器,并且您有一个名为 textArray
的 textViews 数组,您可以执行一个小循环,例如:
-(void)aMethod {
for (UITextField *text in self.textArray) {
if ([text isFirstResponder]) [text resignFirstResponder];
return;
}
}
这样,您可以拥有可变数量的文本字段,并且它仍然可以工作。
如果您只有一个或两个文本字段,并且不想创建 Array 对象,则可以这样做(假设字段名为 text1
和 text2
:
-(void)aMethod {
if ([text1 isFirstResponder]) [text1 resignFirstResponder];
else if([text2 isFirstResponder]) [text2 resignFirstResponder];
}
此外,为了使将来的事情更轻松,您可以为 UIView 创建一个类别方法(这就是我所做的(,以获取当前的第一响应者(如果它作为该视图的子视图存在(:
@implementation UIView (GetFirstResponder)
- (UIView *)getFirstResponder {
if ([self isFirstResponder]) return self;
else {
for (UIView *subview in self.subviews) {
UIView *firstResponder = [subview getFirstResponder];
if (firstResponder) return firstResponder;
}
}
return nil;
}
可以将此方法放在要从中调用它的任何文件的顶部,或者为其创建单独的文件并将其导入。
使用此方法后,可以调用:
- (void)aMethod {
UIView *view = [self.view getFirstResponder];
if (view) [view resignFirstResponder];
}
[superview endEditing:YES]; // superview can be the view controller's view property.