如何在编辑 UITextField 时忽略键盘

使用 jQuery 1.3.2对我来说很有效:

$('iframe').ready(function() {
$('body', $('iframe').contents()).html('Hello World!');
});

我知道我需要告诉我的 UITextField 退出第一响应时,我想关闭键盘,但我不知道如何知道当用户已经按下“完成”键在键盘上。有什么通知我可以看的吗?

198120 次浏览

修订: !

如果您将文本字段的 DidEndOnExit 事件连接到 InterfaceBuilder 中的某个操作(IBAction) ,那么当用户取消键盘时(使用返回键)将会收到消息,并且发送者将是对触发该事件的 UITextField 的引用。

例如:

-(IBAction)userDoneEnteringText:(id)sender
{
UITextField theField = (UITextField*)sender;
// do whatever you want with this text field
}
实际上,上面的代码有时看起来像是在 Firefox 中工作,而在 Opera 中却从来没有工作过。

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

试试这个,

<iframe id="testframe" src="about:blank" onload="if (testframe.location.href != 'about:blank') testframe_loaded()"></iframe>

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

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

然后,您需要做的就是创建 JavaScript 函数 testframe _ load ()。

库比,谢谢。你的代码起作用了。只是为了明确(对于新手喜欢) ,因为你说你必须设置 UITextFielddelegate等于视图控制器中的文本字段居住。你可以在任何你喜欢的地方这样做。我选择了 viewDidLoad方法。

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

以下是我的 NSLog 输出,其中包含了拒绝和接受。你会注意到我正在返回辞职的结果,但我期望它返回假给我报告给来电者? !除此之外,它还有必要的行为。

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

这个方法在我的情况下很有效。

简单地把它放在你的 UITableView 委托类文件(. m)中:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  forRowAtIndexPath:(NSIndexPath *)indexPath
{
UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor];
cell.backgroundColor = color;
}

这里有一个技巧,可以在没有任何代码的情况下获得自动的键盘退出行为。在 nib 中,在 Identity 检查器中编辑 First Responder 代理对象,添加一个新的第一响应者操作; 我们将其称为 dummy:。现在,将文本字段的 Did End on Exit 事件挂钩到 First Responder 代理对象的 dummy:操作。就是这样!由于文本字段的 Was End on Exit 事件现在有一个 action-target 对,当用户点击 Return 时,文本字段会自动解除键盘; 由于没有找到响应者链上发送的消息的处理程序不会受到惩罚,所以即使没有 dummy:的实现,应用程序也不会崩溃。

  • 我创建了一个名为

    -(IBAction)backgroundIsTapped:(id)sender
    
  • This was also defined in the .h file.

    After this, I linked to to the 'touch down' bit for the ViewController in Interface Builder.

    In the 'background is tapped' function, I put this:

        [answerField resignFirstResponder];
    

    这非常简单,因为 OS 3.0只是在 willDisplayCell 方法中设置单元格的背景颜色。 不能在 cellForRowAtIndexPath 中设置颜色。

    只要记住将“ answer erField”更改为要从中移除键盘的 UITextField 的名称(显然要确保您的 UITextField 的定义如下所示:)

        IBOutlet UITextField * <nameoftextfieldhere>;
    

    我知道这个话题可能很久以前就过时了... ... 但我希望这能帮到某个人,某个地方!

    这适用于普通风格和分组风格:

    当他们滑进或者

    密码:

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor redColor];
    }
    
    出去。”

    附注: 这里是 will DisplayCell 的文档摘录:

    ”表视图将此消息发送到

    我在 这是上校的帖子中找到了这个信息。谢谢他!

    textField.returnKeyType = UIReturnKeyDone;
    
    它的委托在使用单元格之前

    创建一个函数 hide 键盘并将其链接到. xib 文件中的 textfield,然后选择 DidEndOnExit

    -(IBAction)Hidekeyboard
    {
    textfield_name.resignFirstResponder;
    }
    

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

    -(IBAction)dismissKeyboard:(id)sender
    {
    [sender resignFirstResponder];
    }
    
    画一行,从而允许 委托来自定义单元格对象

    只需右键单击视图中的文本字段,并将事件设置为 Was End on Exit,然后将其连接到方法“ distsKeyboard”。

    对初学者最好的指南是 在显示之前。此方法 给代表一个机会 “ Head First iPhone 和 iPad 开发,第2版”

    试试这个

    - (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
    {
    if ([text isEqualToString:@"\n"]) {
    [textView resignFirstResponder];
    return NO;
    }
    return YES;
    }
    
    //====================================================
    //                  textFieldShouldReturn:
    //====================================================
    -(BOOL) textFieldShouldReturn:(UITextField*) textField {
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
    [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
    }
    
    重写基于状态的属性集

    你也可以用

     - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
    
    
    [self.yourTextField resignFirstResponder];
    
    
    }
    
    在表视图的前面,例如

    如果你有很多 Uitextfields,最好的选择是:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
    [self.view endEditing:YES];
    }
    
    选择和背景颜色

    这里是一个相当干净的方式来结束与返回键或在后台触摸版本。

    委托返回表视图

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

    只设置阿尔法和框架

    这门课是做什么的:

      财产,然后只有当
    • 自动附加自身作为字段委托(从 nib 唤醒,或手动添加)
    • 动画行,因为它们滑入或 出去。”

    • 在当前编辑的字段上保留引用
    • 我在 这是上校的帖子中找到了这个信息。谢谢他!

    • 退出键盘或在后台触摸
    Eld *) textField {

    密码如下:

    接口

    #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
    
      CurrentEditingTextField = NULL; }
    • 通过对窗体进行子类化并重写 textFieldValueIsValid:方法,你 开始: (NSSet < UITouch * > *) touch withEvent: (UIEvent *) event { [ self endEdit ] ; 如果给定的值不正确,可以避免版本结束 } 字段 - (BOOL) textFieldShouldReturn: (UITextField *) textField {

    • 如果字段的委托设置为 Interface Builder,则表单不会更改该字段。我看不出有什么理由为特定字段设置不同的委托,但为什么不... ..。

    If ([ self textFieldValueIsValid: textField ]){ [ self endEdit ] ;

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

    返回 YES; {

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

    报税表编号;

    希望能有所帮助,干杯

    } }

    如果您希望在 UIViewController 中进行所有编辑,则可以使用。

    [[self view]endEditing:YES];
    
    //自有职能

    如果你想解除一个特定的 UITextField 键盘隐藏,然后使用。

    编辑 {

    在 viewControler.h 中添加委托

    <UITextFieldDelegate>
    
      如果(currentEditingTextField){ [ currentEditingTextField endEditing: YES ] ;
    1. 使授权无法进入您的文本字段。

      CurrentEditingTextField = NULL; } }

      Self.yourTextField.delegate = self;

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

      //在子类中重写它,以处理可能阻止验证的最终值。 - (BOOL) textFieldValueIsValid: (UITextField *) textField

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

        返回 YES; }

  • 通过对窗体进行子类化并重写 textFieldValueIsValid:方法,你 如果给定的值不正确,可以避免版本结束 字段

  • 如果字段的委托设置为 Interface Builder,则表单不会更改该字段。我看不出有什么理由为特定字段设置不同的委托,但为什么不... ..。

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

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

    3)使用下面的委托方法

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

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

    UPD: 对我来说还是很好用的。我认为那个回答这个问题的人只是不明白他需要在故事板中将这个操作绑定到 UITextField。

    为了扩展 N.Berendt 的回答——如果你想根据实际单元格数据对象中的某个状态来设置单元格颜色,那么在为表格单元格配置其余信息的时候,通常是在 cellForRowAtIndexPath 方法中,你可以通过覆盖 willDisplayCell 方法来设置来自内容视图背景颜色的单元格背景颜色——这绕过了公开按钮背景颜色等问题,但是仍然允许你在 cellForRowAtIndexPath 方法中控制颜色,在这个方法中你正在进行所有其他单元格的定制。

    重写 willDisplayCell 方法来设置从内容视图背景颜色的单元格背景颜色——这绕过了公开按钮背景颜色等问题不正确,但仍然可以让你在 cellForRowAtIndexPath 方法中控制颜色,在这个方法中你可以进行所有其他单元格的定制。

    如果将此方法添加到表视图委托:

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = cell.contentView.backgroundColor;
    }
    
    如果将此方法添加到表视图委托:

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = cell.contentView.backgroundColor;
    }
    

    然后在 cellForRowAtIndexPath 方法中,您可以:

    if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
    cell.contentView.backgroundColor = [UIColor blueColor];
    }
    

    然后在 cellForRowAtIndexPath 方法中,您可以:

    if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
    cell.contentView.backgroundColor = [UIColor blueColor];
    }
    

    这样可以节省在 willDisplayCell 方法中再次检索数据对象的时间,也可以节省在裁剪/定制表单元格时的两个位置——所有的定制都可以在 cellForRowAtIndexPath 方法中进行。

    //标记:-处理委托 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
    }
    

    子类 UITableViewCell 并将其添加到实现中:

    -(void)layoutSubviews
    {
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
    }
    

    这就是我在 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()
    }
    
    行动:

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