Ios UITapGestureRecognitor,并在点击背景时使键盘消失

Ios UITapGestureRecognitor,并在点击背景时使键盘消失,ios,ios4,uikeyboard,Ios,Ios4,Uikeyboard,我创建了一个表单,输入年龄等数据时,键盘(仅数字)会出现 我希望当用户点击背景时键盘消失,我希望在7(零旁边)下的空插槽中添加一个“完成”按钮。(我正在使用数字键盘) 我找到了这个例子,但我有几个问题 在 如果我的表单中有多个文本字段。 是否需要在dismissKeyboard方法中写入每个文本字段?您应该只将dismissKeyboard发送到当前正在编辑的textfield 代码中存在内存泄漏。最好使用这个: -(void)viewDidLoad { UITapGestureReco

我创建了一个表单,输入年龄等数据时,键盘(仅数字)会出现

我希望当用户点击背景时键盘消失,我希望在7(零旁边)下的空插槽中添加一个“完成”按钮。(我正在使用数字键盘)

我找到了这个例子,但我有几个问题

如果我的表单中有多个文本字段。
是否需要在dismissKeyboard方法中写入每个文本字段?

您应该只将
dismissKeyboard
发送到当前正在编辑的
textfield

代码中存在内存泄漏。最好使用这个:

-(void)viewDidLoad
{
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    [self.view addGestureRecognizer:tap]; 
    [tap release];
}
要检查
UITextField
当前是否处于
编辑模式
,可以检查其属性:

一个布尔值,指示文本字段当前是否处于编辑模式。(只读)

例如,您有3个文本字段,然后键盘将如下所示:

-(void)dismissKeyboard
{
    UITextField *activeTextField = nil;
    if ([textField1 isEditing]) activeTextField = textField1;
    else if ([textField2 isEditing]) activeTextField = textField2;
    else if ([textField3 isEditing]) activeTextField = textField3;
    if (activeTextField) [activeTextField resignFirstResponder];
}
- (IBAction)backgroundTap:(id)sender
{
    if ([textField1 isEditing]) {
        [textField1 resignFirstResponder];
    } else if ([textField2 isEditing]) {
        [textField2 resignFirstResponder];
    }
}

我在我的许多应用程序中使用相同的功能。我没有使用手势识别器,而是将我的视图设置为
UIControl
,而不是
UIView
。您仍然可以使用
UIView
执行操作,但也可以指定与视图交互时要执行的
iActions

以下是如何做到这一点: 在Interface Builder中,选择您的视图。然后,将其类分配给
UIControl
。(当前可能设置为
UIView

在该视图的ViewController中,编写一个iAction方法来检测背景窃听。我的方法如下所示:

-(void)dismissKeyboard
{
    UITextField *activeTextField = nil;
    if ([textField1 isEditing]) activeTextField = textField1;
    else if ([textField2 isEditing]) activeTextField = textField2;
    else if ([textField3 isEditing]) activeTextField = textField3;
    if (activeTextField) [activeTextField resignFirstResponder];
}
- (IBAction)backgroundTap:(id)sender
{
    if ([textField1 isEditing]) {
        [textField1 resignFirstResponder];
    } else if ([textField2 isEditing]) {
        [textField2 resignFirstResponder];
    }
}

最后,在界面生成器中,将您创建的iAction连接到
UIControl

阅读本文,它可能会帮助您

简单的方法是使用UIView中提供的方法

- (BOOL) endEditing:(BOOL)force;
此方法查看当前作为第一响应者的文本字段的当前视图及其子视图层次结构。如果找到一个文本字段,它将要求该文本字段辞去第一响应者的职务。如果force参数设置为YES,则该文本字段甚至从未被问到;它将被迫辞去职务

那么就这么做吧:

-(void)dismissKeyboard {
     [self.view endEditing:YES];
}

它将支持您在页面上添加的任何其他文本字段(当然是在该UIView下)

这里我给出了通用文本字段对象。并在“textFieldShouldBeginEditing”方法中对其进行了引用。这对所有文本字段都是通用的

在这种情况下,您需要关闭一个将隐藏键盘的文本字段

在.h文件中声明textfield对象

@interface RootViewController : UIViewController
{
    IBOutlet UITextField* txt_common;
}
在.m文件中

- (void)viewDidLoad {
[super viewDidLoad];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap]; 
[tap release];


}

-(void)dismissKeyboard
{
NSLog(@"hi");
[txt_common resignFirstResponder];
}

#pragma mark TextField methods
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
NSLog(@"hi++++++++++++++++++");

txt_common=textField;
return YES;
}

如何获取当前正在编辑的文本字段的名称?Nekto你能告诉我dismissKeyboard方法是什么样子吗?我一定错过了什么。我点击背景,数字键盘没有消失。我需要在IB中连接任何内容吗?试着设置:
self.view.userInteractionEnabled=YES;
我有一个TabBar应用程序。在我的第一个视图中,我添加了一个滚动视图,在滚动视图中,我有元素(文本字段、标签等)。我将上述所有代码添加到FirstViewController。h/m。我想了解如何使用UIGestureRecognizer。我知道其他替代方法(如控件后面的不可见按钮)。如何使用
UITableView
的视图执行此操作?我无法在其上设置
UIControl