拥有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 一个初学者,很难读到这个我必须把它放在这里,那里......呃。简单的人,简单。我不是在寻找优雅的解决方案,只是为了它的工作原理。
答案 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对象,你可以这样做(假设字段名为text1
和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];
}
答案 4 :(得分:0)
如果你不想做那么多事情而只是想解雇键盘而不是将iboutlet提交给你提交给以下方法的每个文本..
-(IBAction)hidekeyboard:(id)sender
{
[sender resignFirstResponder];
}
答案 5 :(得分:0)
[superview endEditing:YES]; // superview can be the view controller's view property.