4

当您有 MULTIPLE 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.) 我不必在视图控制器上添加令人困惑的按钮。(任何时候我必须添加插座,该死的东西都在我身上崩溃......然后发生了令人讨厌的事情,而且真的......记住我只是一个初学者,而且阅读起来非常混乱,我必须把它放在这里并且那里......哦。简单的人,简单。我不是在寻找优雅的解决方案,只是为了让它工作。

4

6 回答 6

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

我的视图控制器.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

于 2013-07-29T02:15:23.983 回答
1

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

于 2014-01-31T13:17:42.623 回答
1

点击文本字段外的任何地方..它将隐藏它..

[self.view endEditing:YES];

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

[myEditField resignFirstResponder];
[myEditField endEditing];
[parentView endEditing];
于 2014-08-30T11:11:04.253 回答
0

If you dont wont to do so many things and simply want to dismiss keyboard than give iboutlet to each of your text filed to following method..

-(IBAction)hidekeyboard:(id)sender
{
    [sender resignFirstResponder];
}
于 2013-07-29T04:00:53.183 回答
0

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

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

例如,如果你有一个方法调用-(void)aMethod你想关闭当前视图控制器,并且你有一个 textViews 数组调用textArray,你可以做一个小循环,例如:

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

这样,您可以拥有可变数量的文本字段,并且它仍然可以工作。

如果您只有一个或两个 textField 并且您不想创建 Array 对象,则可以这样做(假设字段名为text1and 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];
}
于 2013-07-29T02:11:38.910 回答
0
    [superview endEditing:YES];  // superview can be the view controller's view property.
于 2014-01-13T20:15:42.987 回答