使用MULTIPLE UITextFields关闭键盘?

时间:2013-07-29 02:08:40

标签: ios keyboard dismiss

拥有MULTIPLE UITextFields时是否可以关闭键盘?如果是这样的话?

作为旁注,我是否必须关闭“每个”和“每个”字段的键盘,还是可以全局完成?哦,如果我不必触摸DONE按钮,那将是非常酷的,我理想地喜欢一个解决方案,用户触摸任何东西,但有问题的字段和键盘自动消失......

哦,如果你是如此善良的一步一步的指示。


我应该补充一点,我已经有一种方法可以让键盘辞职....

但是,它仅在我的表单提交时运行! (见下面的方法)

我的问题是如何在不必跳过这么多该死的箍的情况下隐藏/解除键盘!你想在6年之后,一个成熟的操作系统会有一种全局隐藏键盘的方法......不!!/ / p>

好的,抱怨......

- (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];

}

我的问题,假设任何人都可以回答这个......我怀疑没有,如果以下条件是MET,有没有办法全局隐藏键盘:1。)用户点击任何一个现有字段的OUT, 2.)按下屏幕上的任何其他位置。 3.)现有的viewcontroller.m文件中只有一行或两行。 4.)我不必在viewcontroller上添加一个令人困惑的按钮。 (任何时候我必须添加插座,这个该死的东西都会撞到我身上......然后发生了肮脏的事情,而且真的......记得我 JUST 一个初学者,很难读到这个我必须把它放在这里,那里......呃。简单的人,简单。我不是在寻找优雅的解决方案,只是为了它的工作原理。

6 个答案:

答案 0 :(得分:6)

我有一个超级类,我的所有视图控制器都继承自。在那堂课里,我有这段代码。

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

答案 1 :(得分:1)

RDVKeyboardAvoiding是一个带有点击手势识别器的滚动视图,专为多个textViews / textFields设计。它跟踪活动视图并删除大量样板代码。

答案 2 :(得分:1)

点击textField外的任何地方..它会隐藏它..

[self.view endEditing:YES];

还有其他几种方法可以做到这一点。

[myEditField resignFirstResponder];
[myEditField endEditing];
[parentView endEditing];

答案 3 :(得分:0)

是的,您只需将其解散为当前正在编辑的那个。

为了知道正在编辑哪一个,您可以检查-(BOOL)isFirstResponder属性,如果它是第一个响应者(正在编辑的那个),则返回YES,否则返回NO。一旦你知道哪一个是第一个响应者,你可以在那个上调用-(void)resignFirstResponder来摆脱键盘。

例如,如果你有一个名为-(void)aMethod的方法要关闭当前视图控制器并且你有一个名为textArray的textViews数组,你可以做一个小循环,例如: / p>

-(void)aMethod {
    for (UITextField *text in self.textArray) {
         if ([text isFirstResponder]) [text resignFirstResponder];
         return;
    }
}

这样,你可以拥有可变数量的textFields,它仍然有用。

如果你只有一个或两个textField并且你不想创建一个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];
}

答案 4 :(得分:0)

如果你不想做那么多事情而只是想解雇键盘而不是将iboutlet提交给你提交给以下方法的每个文本..

-(IBAction)hidekeyboard:(id)sender
{
    [sender resignFirstResponder];
}

答案 5 :(得分:0)

    [superview endEditing:YES];  // superview can be the view controller's view property.