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) -> 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的主要内容,如果未能解决你的问题,请参考以下文章