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对象,则可以这样做(假定这些字段的名称分别为text1
和text2
:
-(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.