iPhone 键盘、完成按钮和 resignFirstResponder

Posted

技术标签:

【中文标题】iPhone 键盘、完成按钮和 resignFirstResponder【英文标题】:iPhone keyboard, Done button and resignFirstResponder 【发布时间】:2011-02-19 04:57:00 【问题描述】:

这可能是一个愚蠢的问题,但我在文档中找不到答案。弹出式键盘上的“完成”按钮是否总是导致键盘消失?我在网上看到很多这样的代码:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
    [theTextField resignFirstResponder];
    return YES;

当我按下“完成”按钮时,键盘弹出,UITextField 退出第一响应者。

我假设按下“完成”按钮不会导致 UITextField 变为 resignFirstResponder,但这种行为有时会发生变化。

我在 OS 3.0 - 3.1.3 上调试

【问题讨论】:

见developer.apple.com/library/ios/#documentation/iphone/… 显然我没有足够的代表来为 nevan king 的答案添加评论,所以我会在这里提到,对于他的解决方案,没有必要将类设为 UITextFieldDelegate。 UITextFieldDelegate 协议只定义了一些发送给委托的消息,询问文本字段是否应该辞职,它确实辞职等......任何对象都可以按照他的答案实现的方式接收操作,只需按照他的方式定义他们的方法完成与 textFieldFinished。 【参考方案1】:

我用 UITextField 和这段代码做了一个小测试项目

#import <UIKit/UIKit.h>
@interface TextFieldTestViewController : UIViewController
<UITextFieldDelegate>

    UITextField *textField;

@property (nonatomic, retain) IBOutlet UITextField *textField;
@end

#import "TextFieldTestViewController.h"
@implementation TextFieldTestViewController
@synthesize textField;

- (void)viewDidLoad

    [self.textField setDelegate:self];
    [self.textField setReturnKeyType:UIReturnKeyDone];
    [self.textField addTarget:self
                  action:@selector(textFieldFinished:)
        forControlEvents:UIControlEventEditingDidEndOnExit];
    [super viewDidLoad];

- (IBAction)textFieldFinished:(id)sender

    // [sender resignFirstResponder];


- (void)dealloc 
    [super dealloc];

@end

文本字段是一个未修改的UITextField,拖到NIB 上,插座已连接。 加载应用程序后,单击文本字段会弹出键盘。按下“完成”按钮会使文本字段失去焦点并激活键盘。请注意,网络上的建议是始终使用[sender resignFirstResponder],但没有它也可以。

【讨论】:

嗯。 addTarget:action:forControlEvents: 是为了什么? setDelegate: 还不够吗?让我自己试试吧。 是的,完全正确。如果你删除 addTarget:… 调用,一切都会好起来的。 对于像我这样的菜鸟,使用界面生成器执行此操作的方法是将 + 从“退出时结束”拖到文件的所有者,然后将其分配给什么都不做的 IBAction (textFieldFinished :(id)sender 在这个例子中)。上面的答案是正确的,只是想补充一下。 如果还是不行,看看这个问题:***.com/questions/3372333/…【参考方案2】:

在 Xcode 5.1 中

启用完成按钮

在 Storyboard 中 UITextField 的 Attributes Inspector 中找到“Return Key”字段并选择“Done”

按下完成时隐藏键盘

在 Storyboard 中,将您的 ViewController 设置为 UITextField 的委托

将此方法添加到您的 ViewController

-(BOOL)textFieldShouldReturn:(UITextField *)textField

    [textField resignFirstResponder];
    return YES;

【讨论】:

添加swift代码供参考:func textFieldShouldReturn(_ textField: UITextField) -&gt; Bool textField.resignFirstResponder() return true 【参考方案3】:

来自文档(任何版本):

这是您的应用程序的 关闭键盘的责任 在您选择的时候。你 可能会关闭键盘作为回应 到特定的用户操作,例如 用户点击特定按钮 您的用户界面。你也可能 将您的文本字段委托配置为 当用户关闭键盘时 按下“返回”键 键盘本身。解雇 键盘,发送 resignFirstResponder 消息 当前第一个文本字段 响应者。这样做会导致文本 结束当前的字段对象 编辑会议(与代表 对象的同意)并隐藏 键盘。

因此,您必须以某种方式发送 resignFirstResponder。但是在处理 textFieldShouldReturn: 消息期间,文本字段可能会以另一种方式失去焦点。这也会导致键盘消失。

【讨论】:

感谢您的回答。我找到了导致UITextField 辞去第一响应者的部分。我有一个调用 ` [textField addTarget: self action: @selector(textFieldDone:) forControlEvents: UIControlEventEditingDidEndOnExit]. Strangely, the textFieldDone:` 方法为空(我删除了resignFirstResponder 调用)。所以我还是不明白为什么键盘消失了。 也许你隐式地将焦点转移到另一个组件?例如,通过更改表格或标签中的某些值? 我不认为还有其他事情发生。我创建了一个小项目(发布了下面的代码),它给出了相同的行为。不太清楚为什么会这样。 nevan,您的解决方案有效。我在一个带有完成键的键盘的表格视图单元格中有一个文本字段。在空输入时,完成键不会关闭键盘。添加 addTarget 代码后,它现在正在关闭键盘。【参考方案4】:

完成按钮的一行代码:-

[yourTextField setReturnKeyType:UIReturnKeyDone];

并在 TextField 的 valueChanged 上添加 action 方法并添加这一行-

[yourTextField resignFirstResponder];

【讨论】:

【参考方案5】:

我用这个方法来改变选择文本字段

- (BOOL)textFieldShouldReturn:(UITextField *)textField 

if ([textField isEqual:self.emailRegisterTextField]) 

    [self.usernameRegisterTextField becomeFirstResponder];

 else if ([textField isEqual:self.usernameRegisterTextField]) 

    [self.passwordRegisterTextField becomeFirstResponder];

 else 

    [textField resignFirstResponder];

    // To click button for registration when you clicking button "Done" on the keyboard
    [self createMyAccount:self.registrationButton];


return YES;

【讨论】:

以上是关于iPhone 键盘、完成按钮和 resignFirstResponder的主要内容,如果未能解决你的问题,请参考以下文章

删除 iphone 普通键盘中的完成按钮

iPhone:使用 XIB 退出键盘并完成按钮操作

在 iPhone 小键盘 iOS9 上方添加自定义按钮

完成按钮仅适用于数字键盘

关闭 iPhone 模拟器上的键盘

更改 iOS 虚拟键盘“上一个”、“下一个”、“完成”按钮的语言