187

我知道当我想关闭键盘时,我需要告诉我的 UITextField 让第一响应者辞职,但我不确定如何知道用户何时按下了键盘上的“完成”键。有我可以关注的通知吗?

4

22 回答 22

354

我将代表设置UITextField为我的ViewController班级。

在那个类中,我实现了这个方法如下:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}
于 2008-11-08T04:16:41.437 回答
47

如果您将文本字段的 DidEndOnExit 事件连接到 InterfaceBuilder 中的操作 (IBAction),它将在用户关闭键盘(使用返回键)时收到消息,并且发送者将是对触发事件的 UITextField 的引用。

例如:

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

然后,在 InterfaceBuilder 中,将文本字段的 DidEndOnExit 事件链接到控制器上的此操作(或用于链接 UI 事件的任何东西)。每当用户输入文本并关闭文本字段时,控制器都会收到此消息。

于 2008-11-08T03:51:31.923 回答
32

您还可以在控制器中创建一个方法

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

然后在 IB 的 Connection Inspector 中将事件“Did End On Exit”连接到它。

于 2009-05-01T20:20:55.590 回答
19

库比,谢谢。您的代码有效。就像你说的那样明确(对于新手来说),你必须将UITextField'sdelegate设置为等于文本字段所在的 ViewController 。您可以随心所欲地执行此操作。我选择了viewDidLoad方法。

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}
于 2008-11-13T02:44:36.050 回答
18

这是一个无需代码即可获得自动键盘关闭行为的技巧。在 nib 中,编辑 Identity inspector 中的 First Responder 代理对象,添加一个新的 First Responder 动作;让我们称之为dummy:。现在将文本字段的 Did End on Exit 事件挂钩到dummy:First Responder 代理对象的操作。就是这样!由于文本字段的 Did End on Exit 事件现在有一个动作-目标对,所以当用户点击 Return 时,文本字段会自动关闭其键盘;并且由于没有为在响应者链上发送的消息找到处理程序不会受到惩罚,因此即使在dummy:任何地方都没有实现,应用程序也不会崩溃。

于 2010-12-14T22:51:33.537 回答
11

只需添加

[textField endEditing:YES];

您要在其中禁用键盘并显示选择器视图。

于 2010-08-19T00:50:21.337 回答
11

在 Swift 中,您可以在 Controller 中编写 IBAction 并将文本字段的Did End On Exit事件设置为该操作

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}
于 2016-05-08T23:22:18.307 回答
10

Swift 4.2它会 100% 工作

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        self.textField.delegate = self

    }

    // hide key board when the user touches outside keyboard

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

    // user presses return key

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

}
于 2019-07-09T03:26:48.403 回答
4

你也可以使用

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  {

   [self.yourTextField resignFirstResponder];

  }

如果你有很多 Uitextfields 最好的一个:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {    
     [self.view endEditing:YES];
 }
于 2014-09-16T07:36:02.660 回答
2

您会注意到“textFieldShouldReturn”方法提供了按下 DONE 键的文本字段对象。如果您设置标签,您可以打开该文本字段。或者您可以跟踪对象的指针并将其与其创建者存储的某些成员值进行比较。

我的自学方法是这样的:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    bool fDidResign = [textField resignFirstResponder];

    NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");

    return fDidResign;
}

同时,我进行了否定辞职的“验证”测试。这只是为了说明,所以如果用户输入 NO!进场,它不会解散。行为如我所愿,但输出顺序与我预期不同。

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    if( [[textField text] isEqualToString:@"NO!"] ) {
        NSLog(@"%@", textField.text);
        return NO;
    } else {
        return YES;
    }
}

以下是我拒绝接受的 NSLog 输出。您会注意到我正在返回辞职结果,但我希望它返回 FALSE 给我以向调用者报告?!除此之外,它具有必要的行为。

13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
13.327 StudyKbd[109:207] 不!
13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]:确实放弃了键盘
59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]:否
59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]:确实放弃了键盘
于 2009-10-01T02:18:30.920 回答
2

这是我必须做的才能让它工作,我认为对于任何有数字键盘的人来说都是必要的(或任何其他没有完成按钮的人:

  1. 我将 ViewController 中的 UIView 更改为 UIControl。
  2. 我创建了一个名为

    -(IBAction)backgroundIsTapped:(id)sender
    

这也在 .h 文件中定义。

在此之后,我链接到 Interface Builder 中 ViewController 的“touch down”位。

在“背景被挖掘”功能中,我放了这个:

    [answerField resignFirstResponder];

请记住将“answerField”更改为您要从中删除键盘的 UITextField 的名称(显然请确保您的 UITextField 定义如下:)

    IBOutlet UITextField * <nameoftextfieldhere>;

我知道这个话题可能很久以前就死了......但我希望这会在某个地方对某人有所帮助!

于 2012-06-21T16:52:57.590 回答
1

这是使用返回键或在后台触摸结束版本的一种非常干净的方法。

在界面生成器中,将您的字段嵌入到 UIFormView 类的视图中

这堂课是什么:

  • 自动将自身附加为字段委托(从 nib 唤醒或手动添加)
  • 保留对当前编辑字段的引用
  • 返回时关闭键盘或在后台触摸

这是代码:

界面

#import <UIKit/UIKit.h>

@interface UIFormView : UIView<UITextFieldDelegate>

-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;

@end

执行

#import "UIFormView.h"

@implementation UIFormView
{
    UITextField* currentEditingTextField;
}

// Automatically register fields

-(void)addSubview:(UIView *)view
{
    [super addSubview:view];
    if ([view isKindOfClass:[UITextField class]]) {
        if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
    }
}

// UITextField Protocol

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    currentEditingTextField = textField;
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    currentEditingTextField = NULL;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self endEdit];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if ([self textFieldValueIsValid:textField]) {
        [self endEdit];
        return YES;
    } else {
        return NO;
    }
}

// Own functions

-(void)endEdit
{
    if (currentEditingTextField) {
        [currentEditingTextField endEditing:YES];
        currentEditingTextField = NULL;
    }
}


// Override this in your subclass to handle eventual values that may prevent validation.

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

@end
  • 通过子类化表单并覆盖 textFieldValueIsValid:方法,如果给定字段的值不正确,您可以避免编辑结束。

  • 如果某个字段在 Interface Builder 中设置了委托,则表单不会更改它。我看不出有很多理由为特定字段设置不同的委托,但为什么不……</p>

有很多方法可以改进这个表单视图类 - 附加一个委托,做一些布局,当键盘覆盖一个字段时处理(使用 currentEditingTextField 框架),自动开始下一个字段的编辑,......

我个人将它保存在我的框架中,并始终将其子类化以添加功能,它通常“按原样”有用。

我希望它会有所帮助。祝大家欢呼

于 2015-09-08T00:54:30.300 回答
1

如果你想在 UIViewController 中进行所有编辑,你可以使用。

[[self view]endEditing:YES];

如果你想关闭一个特定的 UITextField 键盘隐藏然后使用。

1.在 viewcontroller.h 中添加委托

<UITextFieldDelegate>
  1. 使委派无法访问您的文本字段。

    self.yourTextField.delegate = self;

  2. 将此方法添加到您的视图控制器中。

    -(BOOL)textFieldShouldEndEditing:(UITextField *)textField{ [textField resignFirstResponder]; 返回是;}

于 2015-11-03T10:25:29.747 回答
1

以编程方式在 swift 3 中设置 UITextField 的委托

在您的 ViewController.Swift 文件中实现 UITextFieldDelegate(例如 class ViewController: UIViewController, UITextFieldDelegate { )

 lazy var firstNameTF: UITextField = {

    let firstname = UITextField()
    firstname.placeholder = "FirstName"
    firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
    firstname.textAlignment = .center
    firstname.borderStyle = UITextBorderStyle.roundedRect
    firstname.keyboardType = UIKeyboardType.default
    firstname.delegate = self
    return firstname
}()

lazy var lastNameTF: UITextField = {

    let lastname = UITextField()
    lastname.placeholder = "LastName"
    lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
    lastname.textAlignment = .center
    lastname.borderStyle = UITextBorderStyle.roundedRect
    lastname.keyboardType = UIKeyboardType.default
    lastname.delegate = self
    return lastname
}()

lazy var emailIdTF: UITextField = {

    let emailid = UITextField()
    emailid.placeholder = "EmailId"
    emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
    emailid.textAlignment = .center
    emailid.borderStyle = UITextBorderStyle.roundedRect
    emailid.keyboardType = UIKeyboardType.default
    emailid.delegate = self
    return emailid
}()

// 标记:- 处理委托文本字段..

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

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

    if textField == firstNameTF {

        lastNameTF.becomeFirstResponder()
    }

    else if textField == lastNameTF {

        emailIdTF.becomeFirstResponder()
    }
    else {
        view.emailIdTF(true)
    }
    return true
}
于 2017-12-28T05:27:08.270 回答
0

创建一个函数 hidekeyboard 并将其链接到 .xib 文件中的文本字段并选择 DidEndOnExit

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  
于 2013-09-12T10:12:12.773 回答
0

如果你已经使用Interface Builder创建了视图,使用下面的创建方法即可,

-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}

只需右键单击视图中的文本字段,并将事件设置为退出时结束,并将其连接到方法“dismissKeyboard”。

适合初学者的最佳指南是“Head First iPhone and iPad Development, 2nd Edition”

于 2013-11-13T09:50:29.283 回答
0

试试这个

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
于 2014-01-31T13:52:16.457 回答
0
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}
于 2014-09-14T02:52:43.763 回答
0

任何寻找Swift 3的人

1) 确保你的UITextField 的 Delegate连接到 Storyboard 中的 ViewController

2) 在你的 ViewController.Swift 文件中实现UITextFieldDelegate (eg class ViewController: UIViewController, UITextFieldDelegate { )

3)使用下面的委托方法

func textFieldShouldReturn(textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
return false }
于 2017-01-06T15:53:37.583 回答
0

这就是我在 Swift 4.2 中关闭键盘的方式,它对我有用:

    override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: 
    #selector(dismissKeyboard))

    view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    numberField.resignFirstResponder()
    }
于 2019-02-22T08:52:11.867 回答
-2

斯威夫特 3,iOS 9+

@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}

UPD:它对我来说仍然很好用。我认为提供此答案的人只是不明白他需要将此操作绑定到情节提要上的 UITextField 。

于 2017-09-04T22:18:02.740 回答
-6
textField.returnKeyType = UIReturnKeyDone;
于 2013-06-24T17:41:34.993 回答