UITapGestureRecognizer并在点击背景时使键盘消失

时间:2011-09-06 18:57:38

标签: ios ios4 uikeyboard

我创建了一个表单,并在输入与您年龄相关的数据时显示键盘(仅限数字)。

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

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

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

-(void)dismissKeyboard
{
[aTextField resignFirstResponder];
[aTextField1 resignFirstResponder];
[aTextField2 resignFirstResponder];
[aTextField3 resignFirstResponder];
}

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

5 个答案:

答案 0 :(得分:14)

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

- (BOOL) endEditing:(BOOL)force;
  

此方法查看当前第一个响应者的文本字段的当前视图及其子视图层次结构。如果找到一个,则要求该文本字段作为第一响应者辞职。如果force参数设置为YES,则永远不会询问文本字段;它被迫辞职。

所以就这样做:

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

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

答案 1 :(得分:5)

您只应将dismissKeyboard发送给您当前正在编辑的textField

在您的代码中,您有内存泄漏。更好地使用这个:

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

要检查UITextField当前是否edit mode,您可以查看其属性:

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

@property(nonatomic, readonly, getter=isEditing) BOOL editing

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

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

答案 2 :(得分:1)

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

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

在该视图的ViewController中,编写一个IBAction方法来检测backgroundTaps。我看起来像这样:

- (IBAction)backgroundTap:(id)sender
{
    if ([textField1 isEditing]) {
        [textField1 resignFirstResponder];
    } else if ([textField2 isEditing]) {
        [textField2 resignFirstResponder];
    }
}

最后,在Interface Builder中,将您创建的IBAction连接到UIControl

答案 3 :(得分:0)

阅读这篇文章,它可能会对你有所帮助 Writing iOS 4 Code to Hide the iPhone Keyboard (Xcode 4)

答案 4 :(得分:0)

这里我给出了常见的文本字段对象。和“textFieldShouldBeginEditing”方法中的asign引用。这对所有文本字段都很常见..

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

在.h文件中声明文本字段对象。

@interface RootViewController : UIViewController
{
    IBOutlet UITextField* txt_common;
}

IN .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;
}