如何通过点击任何地方解除数字键盘键盘

时间:2011-08-09 03:30:29

标签: iphone ios xcode numbers uitextfield

我想知道在点击数字键盘外的任何地方时,解除数字键盘键盘的最简单的代码。在文本字段中输入数字是一个简单的应用程序,然后用户可以在用户完成在文本字段上键入数字后关闭键盘。谢谢! :)

16 个答案:

答案 0 :(得分:85)

将文本字段声明为实例变量或属性(如果尚未实现)并实现这样的简单方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [textField resignFirstResponder];
}

会做得很好。

答案 1 :(得分:21)

试试这个方法,

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   [self.view endEditing:YES];
}

现在点按任意位置,看键盘就会解散。 : - )

答案 2 :(得分:7)

快速使用以下代码

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
 {
       textFiled.resignFirstResponder()
 }

查看以下Link

的最新动态

答案 3 :(得分:6)

触摸背景以关闭键盘

如果您还没有,请转到Xcode。我们需要在控制器类中再添加一个动作。将以下行添加到Control_FunViewController.h文件中:

#import <UIKit/UIKit.h>
@interface Control_FunViewController : UIViewController { 
UITextField *nameField;
UITextField *numberField;
}
 @property (nonatomic, retain) IBOutlet UITextField *nameField; ]
@property (nonatomic, retain) IBOutlet UITextField *numberField; 
- (IBAction)textFieldDoneEditing:(id)sender; 
- (IBAction)backgroundTap:(id)sender; 
@end  

保存头文件;切换到实现文件,并添加此代码,它只是告诉两个文本字段,如果有的话,它们会产生第一个响应者状态。在不是第一个响应者的控件上调用resignFirstResponder是完全安全的,因此我们可以安全地在两个文本字段上调用它,而不必检查是否是第一个响应者。

- (IBAction)backgroundTap:(id)sender { 
[nameField resignFirstResponder]; 
[numberField resignFirstResponder];
}

TIP 保存此文件,然后返回Interface Builder。我们现在需要更改nib视图的基础类。如果你看一下笔尖的主窗口,你会发现该视图中有三个图标。第三个叫做View,是我们的nib的主视图,它将所有其他控件和视图保存为子视图。 单击名为View的图标,该图标表示我们的nib容器视图。按␣4调出身份检查员。这是我们可以在Interface Builder中更改任何对象实例的基础类的地方。

在编码时,您将在标题和实现文件之间进行大量切换。幸运的是,Xcode有一个组合键,可以快速切换这些文件。默认组合键是␣␣␣(选项命令向上箭头),尽管您可以使用Xcode的首选项将其更改为您想要的任何内容.76

标有Class的字段目前称为UIView。将其更改为读取UIControl。所有能够触发动作方法的控件都是UIControl的子类,因此通过更改底层类,我们刚刚给出了这个视图触发动作方法的能力。您可以通过按␣2来启用连接检查器来验证这一点。

从Touch Down事件拖动到File's Owner图标,然后选择 backgroundTap:操作。现在,在没有主动控件的情况下触摸视图中的任何位置都会触发我们的新动作方法,这将导致键盘缩回。

请注意 保存笔尖,让我们回去尝试一下。再次编译并运行您的应用程序。这一次,键盘应该不仅在点击完成按钮时消失,而且当您点击不是活动控件的任何地方时也会消失,这是用户期望的行为。

答案 4 :(得分:3)

我尝试在这里实施一些解决方案,发现它们存在一些问题。值得注意的是,我的UIView包含UIScrollView,似乎可以拦截触摸。

当失败时,我认为“点击任何地方”是一种未指明的行为,要求用户猜测如何解除键盘,而不是给他们明确的指导。

此外,我在应用程序中显示的每个其他键盘上都有一个“返回”或“完成”按钮,因此我决定为用户提供一种简单,直观,明确指定的方式来解除键盘上的数字垫与使用中的其他键盘解雇机制一致。

我意识到这不是OP特别要求的,但我相信这是一个比“随处随地”请求更好的解决方案(而且很容易实现!)。

以下代码在我的-viewDidLoad中作为UIViewController的一部分进行调用。

// My app is restricted to portrait-only, so the following works
UIToolbar *numberPadAccessoryInputView      = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44.0f)];

// My app-wide tint color is a gold-ish color, so darkGray contrasts nicely
numberPadAccessoryInputView.barTintColor    = [UIColor darkGrayColor];

// A basic "Done" button, that calls [self.textField resignFirstResponder]
UIBarButtonItem *numberPadDoneButton        = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self.textField action:@selector(resignFirstResponder)];

// It's the only item in the UIToolbar's items array
numberPadAccessoryInputView.items           = @[numberPadDoneButton];

// In case the background of the view is similar to [UIColor darkGrayColor], this
// is put as a contrasting edge line at the top of the UIToolbar
UIView *topBorderView                       = [[UIView alloc] initWithFrame:CGRectMake(0, 0, numberPadAccessoryInputView.frame.size.width, 1.0f)];
topBorderView.backgroundColor               = [UIColor whiteColor];
[numberPadAccessoryInputView addSubview:topBorderView];

// Make it so that this UITextField shows the UIToolbar
self.textField.inputAccessoryView           = numberPadAccessoryInputView;

有了这个,键盘上方添加了一个漂亮,漂亮,直观的控件,清楚地表明用户在完成文本输入后应该如何进行。

我仍然认为Apple应该为这个键盘提供一个“完成”按钮(比如Janak Nirmal发布的链接),但这是对我来说最优雅的非Apple解决方案。

答案 5 :(得分:2)

您必须使用UITapGestureRecognizer来实现此目的。

UITapGestureRecognizer *tapToDismiss = [[UITapGestureRecognizer alloc]initWithTarget: self action: @selector (dismissNumberKeyBoard:)];

然后在你的dismissNumberKeyboard方法中,

-(Void)dismissNumberKeyboard : (id)sender {

   [yourTextField resignFirstResponder];

}

快乐的编码!

答案 6 :(得分:2)

你可以通过在插座上放一个didSet并在那里附上你的inputAccessoryView来很好地实现@ mbm的答案:

Swift代码:

  @IBOutlet var input: UITextField! { didSet {
    let toolbar = UIToolbar(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 0, height: 44)))
    toolbar.items = [
      UIBarButtonItem(barButtonSystemItem: .done, target: self.input,
        action: #selector(resignFirstResponder))
    ]
    input.inputAccessoryView = toolbar
  }}

在xcode 8 / iOS 10中最终看起来像这样:

enter image description here

答案 7 :(得分:1)

只需制作一个像这样的简单功能..

    -(IBAction)hideKeyboard:(id)Sender
{
    [_textValue resignFirstResponder];
}

现在转到你的nib文件并将此函数与didEndOnExit的文本字段连接起来,你很高兴。现在当你点击你的文本字段外,键盘将自行隐藏。

答案 8 :(得分:0)

通常,当用户触摸“取消”按钮时,我会用它来关闭键盘 -

- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar
{
    NSLog(@"cancel clicked");
    [searchBar resignFirstResponder]; // dismiss keyboard
    return;
}

如果您想在用户触摸键盘区域外的任何位置时执行此操作,则需要实施touchesEnded&amp;将此代码放在那里 -

/* Delegate for when touch ends.  */
-(void)touchesEnded:(NSSet *)touches 
          withEvent:(UIEvent *)event
{
    [searchBar resignFirstResponder];
}

我自己没有尝试过这个,但我认为应该这样做......

答案 9 :(得分:0)

我必须为我的UITableView实现类似的UX(里面出现一个UITextField)。首先,向tableView添加UITapGestureRecognizer。这将开始捕捉从现在开始发生的所有点击。

UITapGestureRecognizer* tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
        [self.tableView addGestureRecognizer:tapGestureRecognizer];
        [tapGestureRecognizer release];

然而,副作用是,当用户点击UITextField本身时,您不想关闭键盘。因此,必须区分这种情况。

handleTap方法实现类似于 -

/*
 In the text editing mode, listens to all taps occurring on the table view to exit the mode. There are two special cases to consider:
 a) Text field's clear button
 b) Text field
 */
-(void)handleTap:(UITapGestureRecognizer*)tapRecognizer 
{
    if(tapRecognizer.state == UIGestureRecognizerStateEnded) 
    {

            //Figure out where the user tapped
            CGPoint p = [tapRecognizer locationInView:textField];
            CGRect textFieldBounds = textField.bounds;
            CGRect clearButtonBounds = CGRectMake(textFieldBounds.origin.x + textFieldBounds.size.width - 44, textFieldBounds.origin.y, 44, textFieldBounds.size.height); 

            if(CGRectContainsPoint(clearButtonBounds, p))
                textField.text = @"";

            if(CGRectContainsPoint(textFieldBounds, p))
                return;

        [textField resignFirstResponder];
        //remove the tap gesture recognizer that was added.
        for(id element in self.tableView.gestureRecognizers)
        {
        if([element isKindOfClass:[UITapGestureRecognizer class]])
        {
            [self.tableView removeGestureRecognizer:element];
        }
        }
    }
        [self commitNewText];
    }
}

HTH。如果你喜欢,请将其标记为答案。

-Akshay

答案 10 :(得分:0)

如果您已经制作了自定义数字键盘或其他弹出窗口,另一种解决方案是在您的UIView初始化中使用手势识别器,如下所示:

tapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
tapper.cancelsTouchesInView = NO;
[self addGestureRecognizer:tapper];

 _yourViewController = [[CustomViewController alloc] init];
_yourPopoverController = [[UIPopoverController alloc] initWithContentViewController:_yourViewController];
_yourPopoverController.popoverContentSize = CGSizeMake(550, 300);
_yourViewController.delegate = self;

让handleSingleTap解除popover如果可见并解除编辑:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    if ([_yourPopoverController isPopoverVisible]) {
        [_yourPopoverController dismissPopoverAnimated:YES];
    }

    [self endEditing:YES];
}

答案 11 :(得分:0)

在xcode中5使用Tap Gesture Recognizer并在.h中使用动作声明选择一个名称并在.m

- (IBAction)backgroundTap:(id)sender {
    [self.view endEditing: YES];
}

答案 12 :(得分:0)

这里有很多答案,但仍然不得不努力使用XCode 5来解决这个问题。 读这个: https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html

在UIScrollView中添加Tap Gesture识别器。将其委托设置为viewcontroller。

添加此方法:

- (IBAction)tappedSomewhere:(id)sender {
    [self.view endEditing:YES];
}

到您的UIScrollView实现代码,并通过控制点击并拖动到实现代码将其与Tap Gesture Recognizer相关联。

为我工作。

答案 13 :(得分:0)

对于Swift,通过点击文本字段外的任何位置,最容易解除所有文本字段的键盘是:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
    self.view.endEditing(true)
}

答案 14 :(得分:0)

对于swift 3/4,我喜欢这种情况:

  1. View Controller是UITextFieldDelegate的子类
  2. 在viewDidLoad函数中,您必须设置yourPhonePadField.delegate = self
  3. 并覆盖此功能:

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
       self.view.endEditing(true) 
    }
    

答案 15 :(得分:0)

快捷键5

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
           self.view.endEditing(true)
           return true
       }