关闭具有多个 UITextFields 的键盘



当你有多个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 对象,则可以这样做(假设字段名为 text1text2

-(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.

最新更新