我有一个UITextfield,我想关闭键盘。无论我使用什么代码,我似乎都无法使键盘消失。
Answers:
[myTextField resignFirstResponder]
在这里,显示和隐藏键盘部分的第二段。
如果您有多个文本字段而又不知道哪个是第一响应者(或者无论您在何处编写此代码,都根本无法访问文本字段),则可以endEditing:
在包含文本字段的父视图上进行调用。
在视图控制器的方法中,它看起来像这样:
[self.view endEditing:YES];
该参数强制文本字段退出第一响应者状态。如果您正在使用委托来执行验证,并且想要停止所有操作直到文本字段的内容有效,那么您还可以像这样进行编码:
BOOL didEndEditing = [self.view endEditing:NO];
if (didEndEditing) {
// on to the next thing...
} else {
// text field must have said to first responder status: "never wanna give you up, never wanna let you down"
}
该endEditing:
方法比告诉单个文本字段要好得多resignFirstResponder
,但是由于某种原因,直到最近我才发现它。
在某些情况下,没有文本字段是第一响应者,但是键盘在屏幕上。在这些情况下,上述方法无法关闭键盘。
如何到达那里的一个例子:
在这种情况下,您还需要让视图控制器退出编辑模式:
[viewController setEditing:NO animated:YES];
我发现这里的情况endEditing
和resignFirstResponder
失败。在这些情况下,这对我有用。
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
[self setEditing:NO];
UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
在视图控制器YourViewController.h文件中,确保实现UITextFieldDelegate协议:
@interface YourViewController : <UITextFieldDelegate>
@end
然后,在YourViewController.m文件中,实现以下实例方法:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.yourTextField1 resignFirstResponder];
[self.yourTextField2 resignFirstResponder];
...
[self.yourTextFieldn resignFirstResponder];
}
这将放弃一个特定的文本字段
// Swift
TextField.resignFirstResponder()
// Objective C
[TextField resignFirstResponder];
要放弃任何文本字段,请使用以下代码
// Swift
self.view!.endEditing(true)
// Objective C
[self.view endEditing:YES];
作为最后的手段💩
let dummyTextView = UITextView(frame: .zero)
view.addSubview(dummyTextView)
dummyTextView.becomeFirstResponder()
dummyTextView.resignFirstResponder()
dummyTextView.removeFromSuperview()
UITextField
是第一响应者,但是弹出的显示建议的对话框也很活跃。使用“隐藏”按钮关闭键盘不会以某种方式隐藏键盘。这段代码对我有帮助,谢谢!:)
如果您不知道哪个textField是第一响应者,则可以找到它。我使用此功能:
UIView *resignFirstResponder(UIView *theView)
{
if([theView isFirstResponder])
{
[theView resignFirstResponder];
return theView;
}
for(UIView *subview in theView.subviews)
{
UIView *result = resignFirstResponder(subview);
if(result) return result;
}
return nil;
}
然后在您的代码调用中:
UIView *resigned = resignFirstResponder([UIScreen mainScreen]);
-(void)methodName
{
[textFieldName resignFirstResponder];
}
用didEndOnExit调用此方法(methodName)
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
// your code
[textField reloadInputViews];
}
3个简单快捷的步骤
添加UITextFieldDelegate
到您的班级,如下所示:
class RegisterVC: UIViewController, UITextFieldDelegate {
//class implementation
}
在类实现中,添加委托函数textFieldShouldEndEditing:
:
internal func textFieldShouldReturn(_ textField: UITextField) -> Bool {
self.view.endEditing(true)
return true
}
最后UITextField
,在适当的地方将您的代理人设置为自我。例如,在viewDidLoad
函数内部:
override func viewDidLoad(){
super.viewDidLoad()
myTextField1.delegate = self
myTextField2.delegate = self
..
..
}
现在,只要用户按下返回键,键盘就会关闭。
我也准备了一个示例代码段,您可以从此处进行检查。