2011-08-09 200 views
47

我想知道最简单的代码,以便在数字键盘外部的任意位置点击时关闭数字键盘键盘。这是一个简单的应用程序,用于在文本字段中输入数字,然后用户可以在用户输入文本字段上的数字后关闭键盘。谢谢! :)如何通过点击任何地方来关闭数字键盘键盘

+1

如果你想要把完成按钮在数字按钮,您可以按照此链接http://www.neoos.ch/news/46-development/54-uikeyboardtypenumberpad-and-the-missing-return-key –

回答

83

声明的文本字段为实例变量或属性,如果它是不是已经和实现一个简单的方法是这样的:

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

会做得很好。

+2

感谢您的fichek。这是迄今为止关闭键盘的最简单方法。 :) – jsanmtosj

+0

thnx这是我的工作... –

+4

如果用户点击另一个控件(而不是背景),它不会工作得很好。 – ragnarius

0

通常情况下,当用户触摸“取消”按钮,我用它来关闭键盘 - 如果你要当用户在键盘区域外的任何位置触摸来做到这一点

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

,然后您需要实现touchesEnded &把这段代码有 -

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

我自己还没有尝试过,但我侦察这应该做的伎俩......

0

我不得不为我的UITableView实现一个类似的UX(其中出现了UITextField)。首先,将一个UITapGestureRecognizer添加到tableView。这将开始抓住从现在开始的所有水龙头。

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

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

提示 保存此文件,并回到界面生成器。我们现在需要更改我们的笔尖视图的基础类。如果您查看笔尖的主窗口,您会看到该视图中有三个图标。第三个叫View的是我们的笔尖的主视图,它把所有其他的控件和视图看作子视图。 单击名称为View的图标,它代表我们的笔尖的容器视图。按␣4调出身份检查员。这是我们可以在Interface Builder中更改任何对象实例的基础类的地方。

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

标记类字段目前说的UIView。将其更改为读取UIControl。所有能够触发动作方法的控件都是UIControl的子类,所以通过改变底层类,我们只是让这个视图能够触发动作方法。您可以通过按␣2来调出连接检查器来验证。

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

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

+5

感谢您的先生rptwsthi! :)欣赏你的文章。 – jsanmtosj

1

只是做一个简单的功能,像这样的..

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

现在去UR笔尖文件,并与didEndOnExit文本字段连接此功能,你是好去。现在,当你点击你的文本框时,键盘会隐藏自己。

20

试试这个方法,

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

现在任何地方点击并查看键盘将解雇。 :-)

+6

这比接受的答案要好。 –

+3

我不知道我错过了这个API调用,但这是这里最正确的答案。 – TheCodingArt

+1

SOOOO好得多 – needshelp

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解雇该酥料饼如果可见光和解雇编辑:

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

    [self endEditing:YES]; 
} 
0

在Xcode 5使用点击手势识别器,并用行动.H宣布选择了一个名字和.M

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

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

如果失败了,我认为“随处轻敲”有点不明确,需要用户猜测如何关闭键盘而不是给他们明确的指导。

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

我知道这不是什么OP特别要求,但我相信这是比“点击屏幕任意”要求更好的解决方案(这很容易实现!)。

下面的代码被称为在我UIViewController-viewDidLoad一部分。

// 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; 

就这样,有一个漂亮的,漂亮的,直观的控制添加到清楚地表明,当他们与他们的文本输入完成后,用户应如何进行键盘的顶部。

我仍然相信苹果应该为这个键盘(如发表的Janak尼尔默尔的链接),但是这是最优雅的非苹果的解决方案给我提供了一个“完成”按钮。

+0

超级光滑。谢谢! – Andy

7

为SWIFT使用下面的代码

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

退房最新更新对以下Link

+1

谢谢。很高兴在这里看到一个迅速的答案 –

+0

欢迎@ZackShapiro –

+1

'touchesBegan'已更新。如果你有问题,结帐http://stackoverflow.com/questions/28771896/overriding-method-with-selector-touchesbeganwithevent-has-incompatible-type。 – user3731622

0

很多,但这里仍答案不得不努力使用的XCode 5 阅读本弄明白: https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html

添加敲击手势识别器到您的UIScrollView。设置其代表是视图 - 控制。

此方法添加:

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

您的UIScrollView实现代码,它通过控制点击拖动到实现代码关联到敲击手势识别器。

为我工作。

0

对于斯威夫特,最容易通过的文本字段以外的任何地方攻驳回了所有文本字段键盘是:

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

必须使用UITapGestureRecognizer实现这一目标。

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

然后在您的dismissNumberKeyboard方法,

-(Void)dismissNumberKeyboard : (id)sender { 

    [yourTextField resignFirstResponder]; 

} 

编码愉快!

1

您可以通过将一个didSet在出口和有附加的inputAccessoryView实现@ MBM的回答真的很好:

斯威夫特代码:

@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

0

SWIFT的3/4,我喜欢这种情况下:

  1. 视图控制器子类UITextFieldDelegate
  2. 在viewDidLoad中的功能,你必须设置yourPhonePadField.delegate = self
  3. 并覆盖该功能:

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