iPhone键盘,Done按钮和resignFirstResponder
iPhone键盘,Done按钮和resignFirstResponder
这可能是一个愚蠢的问题,但是我在文档中找不到答案。在弹出键盘上,“完成”按钮是否总是导致键盘消失?我在网络上看到了很多类似的代码:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { [theTextField resignFirstResponder]; return YES; }
当我按下“完成”按钮时,键盘弹出并且UITextField
放弃了第一响应者。
我猜测以前按下“完成”按钮不会导致UITextField
放弃第一响应者,但这种行为在某个时候发生了改变。
我在OS 3.0 - 3.1.3上进行调试。
问题的原因是在处理textFieldShouldReturn:消息期间,文本字段以某种方式失去了焦点,导致键盘消失。解决方法是在代码中添加resignFirstResponder方法,或者通过将焦点移动到另一个组件来解决。
解决方法示例代码如下:
textField.resignFirstResponder()
如果你发现在处理textFieldShouldReturn:消息时键盘消失,但又没有找到原因,可以考虑以下几点:
- 是否在代码中调用了resignFirstResponder方法?
- 是否在其他地方将焦点移动到了其他组件上,比如改变表格或标签中的某个值?
- 是否在文本字段的代理方法中处理了其他与键盘相关的事件?
通过添加resignFirstResponder方法或检查焦点移动的代码,你可以解决文本字段失去焦点导致键盘消失的问题。
在Xcode 5.1中,出现了“iPhone键盘、完成按钮和resignFirstResponder”的问题。问题的原因是在Storyboard中没有启用“完成”按钮和隐藏键盘的功能。解决这个问题的方法如下:
1. 启用“完成”按钮:
- 在Storyboard中选择UITextField,在属性检查器中找到“Return Key”字段,并选择“Done”。
2. 当按下“完成”按钮时隐藏键盘:
- 在Storyboard中将您的ViewController设置为UITextField的代理。
- 在ViewController中添加以下方法:
Objective-C代码:
-(BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; }
Swift代码:
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
这样,当用户在UITextField中按下“完成”按钮时,键盘将被隐藏。
iPhone键盘,Done按钮和resignFirstResponder问题的出现的原因是因为在代码中没有使用resignFirstResponder方法来取消响应者的第一响应状态。解决方法是在textFieldFinished方法中加入[sender resignFirstResponder]代码。
具体代码如下:
#import
TextFieldTestViewController : UIViewController
{
UITextField *textField;
}
@property (nonatomic, retain) IBOutlet UITextField *textField;
@end
#import "TextFieldTestViewController.h"
@implementation TextFieldTestViewController
@synthesize textField;
- (void)viewDidLoad
{
[super viewDidLoad];
[self.textField setDelegate:self];
[self.textField setReturnKeyType:UIReturnKeyDone];
[self.textField addTarget:self
action:@selector(textFieldFinished:)
forControlEvents:UIControlEventEditingDidEndOnExit];
}
- (IBAction)textFieldFinished:(id)sender
{
[sender resignFirstResponder];
}
- (void)dealloc {
[textField release];
[super dealloc];
}
@end
在加载应用程序后,点击文本框会弹出键盘。点击“完成”按钮会使文本框失去焦点并收起键盘。如果在textFieldFinished方法中不加入[sender resignFirstResponder]代码,也可以正常工作,但是加入这行代码是更好的做法。
另外,addTarget:action:forControlEvents:方法是用来给文本框添加一个事件处理器,当文本框的编辑事件结束时,会调用指定的方法。而setDelegate:方法是设置文本框的代理对象,用来处理文本框的其他事件。两者可以同时使用。