关于ios:编辑UITextField时如何关闭键盘

How do you dismiss the keyboard when editing a UITextField

我知道当我想解除键盘时,我需要告诉我的uitextfield辞去第一响应者,但我不知道如何知道用户何时按下了键盘上的"完成"键。有我可以注意的通知吗?


我把UITextField的代表交给我的ViewController班。

在该类中,我实现了以下方法:

1
2
3
4
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}


如果将文本字段的diEndonexit事件连接到InterfaceBuilder中的操作(IBaction),则当用户解除键盘(使用返回键)时,将发送消息,发送方将是对触发事件的uitextfield的引用。

例如:

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

然后,在InterfaceBuilder中,将文本字段的diendonexit事件链接到控制器上的此操作(或用于从UI链接事件的任何对象)。每当用户输入文本并解除文本字段时,控制器将发送此消息。


也可以在控制器中创建方法

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

然后在ib connect事件中的connection inspector中"doedendonexit"指向它。


谢谢,谢谢。你的代码有效。正如您所说,为了明确(对于像这样的新手)您必须将UITextFielddelegate设置为与文本字段所在的viewcontroller相等。你可以在任何你喜欢的地方做这个。我选择了viewDidLoad方法。

1
2
3
4
5
- (void)viewDidLoad
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}


这里有一个技巧,可以让你在完全没有代码的情况下自动放弃键盘。在NIB中,在标识检查器中编辑第一响应者代理对象,添加一个新的第一响应者操作;我们称之为dummy:。现在,将文本字段的did end on exit事件挂接到第一响应程序代理对象的dummy:操作。就是这样!由于文本字段的did end on exit事件现在有一个action-target对,当用户点击返回时,文本字段会自动关闭键盘;并且由于没有为发送到响应链上的消息找到处理程序而受到惩罚,因此即使在任何地方都没有实现dummy:,应用程序也不会崩溃。


只要添加

1
[textField endEditing:YES];

要禁用键盘并显示选取器视图的位置。


在swift中,您可以在控制器中编写一个ibaction,并将文本字段的did end on exit事件设置为该操作。

1
2
3
@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}

您也可以使用

1
2
3
4
5
6
 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  {

   [self.yourTextField resignFirstResponder];

  }

如果有多个uitextfields,最好是:

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

您会注意到,方法"textfieldShouldReurn"提供了点击了Done键的文本字段对象。如果设置了标记,则可以打开该文本字段。或者,您可以跟踪和比较对象的指针与其创建者存储的某个成员值。

我的方法是这样自学:

1
2
3
4
5
6
7
8
9
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    bool fDidResign = [textField resignFirstResponder];

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

    return fDidResign;
}

与此同时,我进行了"验证"测试,否认辞职。这只是为了说明,所以如果用户键入no!到了野外,它不会解散。这种行为是我想要的,但是输出的顺序并不像我期望的那样。

1
2
3
4
5
6
7
8
9
10
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

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

下面是我的nslog输出,用于此拒绝,然后是接受。你会注意到我正在退回辞职的结果,但我期望它会退回虚假的给我,向来电者报告?!除此之外,它还有必要的行为。

1
2
3
4
5
6
7
8
13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
13.327 StudyKbd[109:207] NO!
13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO
59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard


以下是我要做的工作,我认为对于任何有键盘数字键盘的人(或没有"完成"按钮的任何其他人)来说都是必要的:

  • 我将视图控制器中的uiview更改为uicontrol。
  • 我创建了一个函数

    1
    -(IBAction)backgroundIsTapped:(id)sender
  • 这也是在.h文件中定义的。

    之后,我链接到InterfaceBuilder中的viewController的"touch down"位。

    在"background is tapped"函数中,我将其设置为:

    1
        [answerField resignFirstResponder];

    只需记住将"answerfield"更改为要从中删除键盘的uitextfield的名称(显然,请确保您的uitextfield定义如下:)

    1
        IBOutlet UITextField * <nameoftextfieldhere>;

    我知道这个话题很可能在很久以前就消失了…但我希望这能在某个地方帮助别人!


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

    在viewcontroller.swift文件中实现uitextfieldelegate(例如,类viewcontroller:uiviewcontroller、uitextfieldelegate)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     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
    }()

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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
    }

    如果要在uiviewController中进行所有编辑,可以使用。

    1
    [[self view]endEditing:YES];

    如果你想消除一个特殊的uitextfield键盘隐藏然后使用。

    1.在视图控制器中添加委托。h

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

    self.yourtextfield.delegate=自己;

  • 将此方法添加到视图控制器中。

    -(bool)textfield应禁用:(uitextfield*)textfield{[文本字段resignfirstresponder];返回是的;}


  • 这里有一个非常干净的方法来结束版本与返回键或触摸的背景。

    在Interface Builder中,将字段嵌入到类uiformView的视图中

    这门课是什么?

    • 自动作为字段委托附加自己(从NIB唤醒或手动添加)
    • 在当前编辑字段上保留引用
    • 返回时关闭键盘或触摸背景

    代码如下:

    界面

    1
    2
    3
    4
    5
    6
    7
    8
    #import <UIKit/UIKit.h>

    @interface UIFormView : UIView<UITextFieldDelegate>

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

    @end

    实施

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #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中设置了委托,则表单不会对其进行更改。我看不出有多少理由为某个特定领域设置不同的代表,但为什么不……

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

    我个人将它保存在我的框架中,并且总是将其子类化以添加特性,它通常"原样"非常有用。

    希望能有所帮助。干杯


    试试这个

    1
    2
    3
    4
    5
    6
    7
    8
    9
    - (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
    {
        if ([text isEqualToString:@"
    "]) {
            [textView resignFirstResponder];
            return NO;
        }
        return YES;
    }


    如果使用Interface Builder创建了视图,请使用以下内容只需创建一个方法,

    1
    2
    3
    4
    -(IBAction)dismissKeyboard:(id)sender
    {
    [sender resignFirstResponder];
    }

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

    初学者的最佳指南是"头一代iPhone和iPad开发,第二版"


    这就是我在Swift4.2中关闭键盘的方法,它对我有用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        override func viewDidLoad() {
        super.viewDidLoad()

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

        view.addGestureRecognizer(tap)
        }

        @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
        numberField.resignFirstResponder()
        }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //====================================================
    //                  textFieldShouldReturn:
    //====================================================
    -(BOOL) textFieldShouldReturn:(UITextField*) textField {
        [textField resignFirstResponder];
        if(textField.returnKeyType != UIReturnKeyDone){
            [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
        }
        return YES;
    }

    找斯威夫特3的人

    1)确保您的uitextfield的委托连接到故事板中的viewcontroller。

    2)在viewcontroller.swift文件中实现uitextfieldelegate(例如,类viewcontroller:uiviewcontroller、uitextfieldelegate)

    3)使用下面的委托方法

    1
    2
    3
    func textFieldShouldReturn(textField: UITextField) -> Bool {
       textField.resignFirstResponder()  
    return false }

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

    1
    2
    3
    4
    -(IBAction)Hidekeyboard    
    {    
          textfield_name.resignFirstResponder;    
    }


    SWIFT 3,IOS 9 +

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

    厄普:它对我来说还是很好的。我认为,致力于这个答案的人只是不明白他需要将这个动作绑定到故事板上的uitextfield。


    1
    textField.returnKeyType = UIReturnKeyDone;