繁体   English   中英

使用MULTIPLE UITextFields关闭键盘?

[英]Dismiss the keyboard with MULTIPLE UITextFields?

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

}

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

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

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

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

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

[self.view endEditing:YES];

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

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

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

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

例如,如果您有一个名为-(void)aMethod ,您想要关闭当前视图控制器,并且您有一个名为textArray数组,您可以执行一个textArray ,例如:

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

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

-(IBAction)hidekeyboard:(id)sender
{
    [sender resignFirstResponder];
}
    [superview endEditing:YES];  // superview can be the view controller's view property.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM