closures多个UITextFields的键盘?

有多个UITextField时是否可以closures键盘? 如果这样怎么样?

作为一个侧面说明,我必须解除键盘的每个和每个领域,或者可以在全球范围内完成吗? 哦,如果我不必触摸DONEbutton,那将会非常酷,我理想的情况是喜欢用户触摸任何东西的解决scheme,但是有问题的领域和键盘自动消失…

哦,如果你是这样一步一步的指示。


我应该补充说我有一个方法已经辞职的键盘….

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

我的问题是如何键盘隐藏/解雇,而不必跳过这么多该死的铁环! 你会想到6年后,一个成熟的操作系统将有一种方法来全球隐藏键盘….不!

好的,足够的抱怨…

- (void)hideKeyboard { [self.dancePlace resignFirstResponder]; [self.danceGate resignFirstResponder]; [self.danceTerminal resignFirstResponder]; [self.danceText resignFirstResponder]; [self.danceDate resignFirstResponder]; [self.danceStyle resignFirstResponder]; [self.danceTimeOut resignFirstResponder]; } 

这是我的button被提交时调用….

 - (IBAction)addListingPressed:(id)sender { // NSLog(@"BUTTON PRESSED"); [self hideKeyboard]; [self valuesAdded]; } 

我的问题,假设任何人都可以回答这个…我怀疑不是,如果下列条件是MET,是否有办法在全局隐藏键盘:1)用户点击任何一个现有的领域,2)压在屏幕上的任何其他地方。 3.)在现有的viewcontroller.m文件中不超过一行或两行。 4.)我不必在视图控制器上添加混淆button。 (任何时候我必须添加sockets,这个该死的东西正在撞击我…然后发生了混乱,真的…记得我只是一个初学者,它非常混乱,读我必须把它放在这里,那里有…简单的伙计,简单,我不寻求优雅的解决scheme,只是为了它的工作。

我有一个超级类,所有我的视图控制器inheritance。 在那个类中,我有这个代码。

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 / textFieldsdevise。 它跟踪活动视图,并删除了大量的样板代码。

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

 [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 ,你想closures当前的视图控制器,并且你有一个名为textArray数组,你可以做一些循环,比如:

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

这样,你可以有一个可变数量的textFields,它仍然会工作。

如果您只有一个或两个textField,并且您不想创build一个Array对象,则可以这样做(假定这些字段的名称分别为text1text2

 -(void)aMethod { if ([text1 isFirstResponder]) [text1 resignFirstResponder]; else if([text2 isFirstResponder]) [text2 resignFirstResponder]; } 

另外,为了使未来更容易,您可以为UIView创build一个类别方法(这就是我所做的),以获得当前的第一响应者,如果它作为该视图的子视图存在:

 @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; } 

您可以将此方法置于您想要调用的任何文件的顶部,也可以为其创build一个单独的文件并将其导入。

一旦你有了这个方法,你可以调用:

 - (void)aMethod { UIView *view = [self.view getFirstResponder]; if (view) [view resignFirstResponder]; } 
  [superview endEditing:YES]; // superview can be the view controller's view property. 
Interesting Posts