114

我以UITextField编程方式创建了UITextField一个 viewController 的属性。我需要通过返回和触摸屏幕来关闭键盘。我能够让屏幕触摸消失,但按回车键不起作用。

我已经了解了如何使用情节提要以及通过UITextField直接分配和初始化对象而不将其创建为属性来做到这一点。有可能做到吗?

。H

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // Do any additional setup after loading the view, typically from a nib.
    
    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    _username.delegate = self; 
    
    [self.view addSubview:self.username];
    [_username resignFirstResponder];
    
}

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

@end
4

21 回答 21

281

简单的方法是将委托连接UITextField到 self ( ) 并在使用self.mytestField.delegate = self方法中关闭键盘textFieldShouldReturn[textField resignFirstResponder];

另一种关闭键盘的方法如下:

Objective-C

[self.view endEditing:YES];

迅速:

self.view.endEditing(true)

放置[self.view endEditing:YES];在您想要关闭键盘的位置(按钮事件、触摸事件等)。

于 2013-09-12T04:55:16.787 回答
31

添加这样的委托方法UITextField

@interface MyController : UIViewController <UITextFieldDelegate>

并设置您的textField.delegate = self;then 还添加两个委托方法UITextField

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
    return YES;
}

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
于 2013-09-12T04:35:10.153 回答
29

只需快速使用它来关闭键盘:

UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)

斯威夫特 3

UIApplication.shared.sendAction(#selector(UIResponder.resign‌​FirstResponder), to: nil, from: nil, for: nil)
于 2015-11-10T05:16:45.677 回答
26

//通过在视图中触摸背景来隐藏键盘

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}
于 2014-08-05T07:56:35.113 回答
20

斯威夫特 4:

self.view.endEditing(true)

或者

将文本字段的委托设置为当前视图控制器,然后:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true

}

目标-C:

[self.view endEditing:YES];

或者

将文本字段的委托设置为当前视图控制器,然后:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];

    return YES;
}
于 2018-01-16T05:15:00.160 回答
9

在 App Delegate 中,您可以编写

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

使用这种方式,你可以不写太多的代码。

于 2015-06-04T10:09:32.783 回答
7

这是我在代码中使用的内容。它就像一个魅力!

在 yourviewcontroller.h 添加:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

现在在 .m 文件中,将其添加到您的 ViewDidLoad 函数中:

- (void)viewDidLoad {
    [super viewDidLoad];

    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

此外,在 .m 文件中添加此函数:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}
于 2015-01-07T19:21:34.093 回答
7

尝试了解 iOS 视图层次结构中的第一响应者是什么。当您在文本字段内部触摸(或以编程方式传递消息)时,当您的文本字段变为活动状态(或第一响应者)时becomeFirstResponder,它会显示键盘。因此,要将您的文本字段从第一响应者中删除,您应该将消息传递resignFirstResponder给它。

[textField resignFirstResponder];

并且要在其返回按钮上隐藏键盘,您应该实现其委托方法textFieldShouldReturn:并传递resignFirstResponder消息。

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
    return YES;
}
于 2013-09-12T04:45:50.703 回答
5

对于 a 内的一组UITextViews ViewController

斯威夫特 3.0

for view in view.subviews {
    if view is UITextField {
        view.resignFirstResponder()
    }
}

Objective-C

// hide keyboard before dismiss
for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {
        // no need to cast
        [view resignFirstResponder];
    }
}
于 2014-10-01T01:16:08.263 回答
4

要在键盘弹出后关闭键盘,有两种情况

  1. 当 UITextField在 UIScrollView 内时

  2. 当 UITextField在 UIScrollView 之外时

2.当 UITextField 在 UIScrollView 之外时,覆盖 UIViewController 子类中的方法

您还必须为所有 UITextView 添加委托

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. 滚动视图中,Tapping outside 不会触发任何事件,因此在这种情况下,请使用 Tap Gesture Recognizer,拖放滚动视图的UITapGesture并为其创建 IBAction

要创建 IBAction,请按 ctrl+ 单击 UITapGesture 并将其拖到 viewcontroller 的 .h 文件中。

在这里,我将 tappedEvent 命名为我的操作名称

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

以上给出的信息来源于以下链接,如果您不理解以上数据,请参考更多信息或与我联系。

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/

于 2015-12-02T05:18:26.877 回答
3

我知道其他人已经回答了这个问题,但我发现另一篇文章也涵盖了没有背景事件 - 表格视图或滚动视图。

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/

于 2014-11-20T23:06:06.203 回答
3

在斯威夫特 3

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

或者

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == yourtextfieldName
        {
            self.resignFirstResponder()
            self.view.endEditing(true)
        }
    }
于 2017-12-13T16:49:45.513 回答
3

由于标签只说 iOS 我将发布 Swift 1.2 和 iOs 8.4 的答案,因此将这些添加到您的视图控制器 swift 类中:

// MARK: - Close keyboard when touching somewhere else
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    self.view.endEditing(true)

}

// MARK: - Close keyboard when return pressed
func textFieldShouldReturn(textField: UITextField!) -> Bool {

    textField.resignFirstResponder()

    return true
}
// MARK: -

另外不要忘记在类声明中添加 UITextFieldDelegate 并将您的文本字段委托设置为 self(视图)。

于 2015-08-06T16:18:05.933 回答
2

首先,您需要在 .h 文件中添加文本字段删除。如果不声明 (BOOL)textFieldShouldReturn:(UITextField *)textField这个方法不被调用。所以首先添加委托并将键盘隐藏代码写入该方法。

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

试试这个。。

于 2013-09-12T04:36:17.540 回答
2

所以这就是我在触摸背景或返回后让它消失的方法。我必须在 viewDidLoad 中添加委托 = self,然后在 .m 文件中添加委托方法。

.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>


@property (strong, atomic) UITextField *username;

@end

.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    self.username.delegate = self;
    [self.username resignFirstResponder];
    [self.view addSubview:self.username];


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    return YES;
}



- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

@end
于 2013-09-12T21:23:39.953 回答
2

只需在 Objective-C 中使用它来关闭键盘:

[[UIApplication sharedApplication].keyWindow endEditing:YES];
于 2018-09-28T02:25:21.273 回答
0

添加委托:UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

然后添加这个委托方法

// 这应该可以完美运行

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
于 2013-09-12T04:53:50.047 回答
0

斯威夫特 2:

这就是要做的每一件事!

Done用按钮 或关闭键盘Touch outSideNext转至下一个输入。

首先在 StoryBoard 中将TextFiled 更改Return Key为。Next

override func viewDidLoad() {
  txtBillIdentifier.delegate = self
  txtBillIdentifier.tag = 1
  txtPayIdentifier.delegate  = self
  txtPayIdentifier.tag  = 2

  let tap = UITapGestureRecognizer(target: self, action: "onTouchGesture")
  self.view.addGestureRecognizer(tap)

}

func textFieldShouldReturn(textField: UITextField) -> Bool {
   if(textField.returnKeyType == UIReturnKeyType.Default) {
       if let next = textField.superview?.viewWithTag(textField.tag+1) as? UITextField {
           next.becomeFirstResponder()
           return false
       }
   }
   textField.resignFirstResponder()
   return false
}

func onTouchGesture(){
    self.view.endEditing(true)
}
于 2015-09-14T07:35:19.650 回答
0

如果您不知道当前视图控制器或文本视图,您可以使用响应者链:

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)
于 2016-06-01T10:50:21.337 回答
0
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UITextField class]]) {
        [obj resignFirstResponder];
    }
}];
}

当您在屏幕中使用多个文本字段时使用此方法您无需每次都提及文本字段

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];
于 2015-07-21T07:55:53.410 回答
0

对于 swift 3-4我固定喜欢

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
}

只需在课堂上的任何地方复制粘贴即可。如果您希望所有 UItextfield 都一样工作,或者您只有一个,则此解决方案才有效!

于 2017-12-13T11:18:41.733 回答