在编辑UITextField时如何关闭键盘

时间:2008-11-08 03:47:54

标签: ios iphone cocoa-touch uitextfield uikeyboard

我知道当我想解开键盘时,我需要告诉我的UITextField辞职第一响应者,但我不知道如何知道用户何时按下键盘上的“完成”键。我可以留意通知吗?

22 个答案:

答案 0 :(得分:346)

我将UITextField的委托设置为我的ViewController课程。

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

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

答案 1 :(得分:47)

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

例如:

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

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

答案 2 :(得分:31)

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

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

然后在IB连接检查器中连接事件“退出时已结束”。

答案 3 :(得分:19)

kubi,谢谢。你的代码工作了。只是为了明确(对于新手来说),因为你说你必须将UITextField的{​​{1}}设置为等于文本字段所在的ViewController。无论何时何地,您都可以这样做。我选择了delegate方法。

viewDidLoad

答案 4 :(得分:18)

这是获取自动键盘解雇行为的技巧,完全没有代码。在nib中,在Identity检查器中编辑First Responder代理对象,添加新的第一响应者操作;我们称之为dummy:。现在将文本字段的Did End on Exit事件挂钩到First Responder代理对象的dummy:操作。而已!由于文本字段的“退出时结束”事件现在具有动作目标对,因此当用户点击“返回”时,文本字段会自动关闭其键盘。并且由于没有为响应者链发送的消息找到处理程序没有惩罚,即使在任何地方都没有dummy:的实现,应用程序也不会崩溃。

答案 5 :(得分:11)

添加

[textField endEditing:YES];

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

答案 6 :(得分:9)

在Swift中,您可以在Controller中编写IBAction,并将文本字段的已结束退出事件设置为该操作

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

答案 7 :(得分:4)

您也可以使用

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

   [self.yourTextField resignFirstResponder];

  }

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

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

答案 8 :(得分:2)

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

我的方法就像这样自学:

- (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] 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

答案 9 :(得分:2)

这是我必须做的才能让它发挥作用,而且我觉得对于键盘的数字键盘(或没有完成键的任何其他键盘)的人来说是必要的:

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

    的函数
    -(IBAction)backgroundIsTapped:(id)sender
    
  3. 这也在.h文件中定义。

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

    在'背景被点击'功能中,我把它放在:

        [answerField resignFirstResponder];
    

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

        IBOutlet UITextField * <nameoftextfieldhere>;
    

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

答案 10 :(得分:1)

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
    }

}

答案 11 :(得分:1)

以编程方式在swift 3

中设置UITextField的委托

在ViewController.Swift文件中实现UITextFieldDelegate(例如,类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
}()

// Mark: - 处理委托textField ..

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
}

答案 12 :(得分:1)

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

[[self view]endEditing:YES];

如果您想要关闭一个特定的UITextField键盘,请使用。

1.在viewcontroller.h中添加委托

<UITextFieldDelegate>
  1. 使委派无法进入您的文本域。

    self.yourTextField.delegate = self;

  2. 将此方法添加到viewcontroller中。

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

答案 13 :(得分:1)

这是一种非常干净的方式,可以通过返回键或背景触摸来结束版本。

在“界面”构建器中,将字段嵌入到类UIFormView

的视图中

这堂课是什么:

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

以下是代码:

接口

#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中设置了委托,则表单不会更改它。我没有看到很多理由为特定领域设置不同的代表,但为什么不呢......

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

我个人将它保存在我的框架中,并且总是将其子类化以添加功能,它通常很有用&#34; as-is&#34;。

我希望它会有所帮助。干杯全部

答案 14 :(得分:0)

//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}

答案 15 :(得分:0)

试试这个

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}

答案 16 :(得分:0)

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

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

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

初学者的最佳指南是       “首创iPhone和iPad开发,第2版”

答案 17 :(得分:0)

任何人都在寻找 Swift 3

1)确保 UITextField的代理连接到故事板中的ViewController

2)在ViewController.Swift文件中实现 UITextFieldDelegate (例如,类ViewController:UIViewController,UITextFieldDelegate {)

3)使用下面的委托方法

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

答案 18 :(得分:0)

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

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  

答案 19 :(得分:0)

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

fooUNKNOWN
fooHello

答案 20 :(得分:-1)

Swift 3,iOS 9 +

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

UPD:它对我来说仍然很好。我认为专门回答这个问题的人并不明白他需要将这个动作绑定到故事板上的UITextField。

答案 21 :(得分:-6)

textField.returnKeyType = UIReturnKeyDone;