【发布时间】:2011-10-17 21:17:42
【问题描述】:
我有一个 UITextfield,我想关闭它的键盘。无论我使用什么代码,我似乎都无法让键盘消失。
【问题讨论】:
-
可能重复:How to close iOS Keyboard by touching anywhere using Swift?(或相反,该帖子与此重复,具有更具体的上下文)
我有一个 UITextfield,我想关闭它的键盘。无论我使用什么代码,我似乎都无法让键盘消失。
【问题讨论】:
作为最后的手段?
let dummyTextView = UITextView(frame: .zero)
view.addSubview(dummyTextView)
dummyTextView.becomeFirstResponder()
dummyTextView.resignFirstResponder()
dummyTextView.removeFromSuperview()
【讨论】:
UITextField,它是第一响应者,但显示建议的弹出窗口也处于活动状态。用隐藏按钮关闭键盘并没有以某种方式隐藏键盘。这段代码在这里帮助了我,谢谢! :)
[myTextField resignFirstResponder]
Here,显示和隐藏键盘部分的第二段。
【讨论】:
退出应用程序中的任何文本字段
UIApplication.shared.keyWindow?.endEditing(true)
这种方法很干净并且可以保证工作,因为根据定义,keyWindow 是显示键盘的所有可能视图的根视图 (source):
按键窗口接收键盘和其他非触摸相关的事件。一次只能有一个窗口是关键窗口。
【讨论】:
我发现了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)
【讨论】:
3 个简单快速的步骤
将UITextFieldDelegate 添加到您的班级,如下所示:
class RegisterVC: UIViewController, UITextFieldDelegate {
//class implementation
}
在类实现中,添加委托函数textFieldShouldEndEditing::
internal func textFieldShouldReturn(_ textField: UITextField) -> Bool {
self.view.endEditing(true)
return true
}
最后一步,在适当的地方将您的 UITextField(s) 委托设置为 self。比如viewDidLoad函数内部:
override func viewDidLoad(){
super.viewDidLoad()
myTextField1.delegate = self
myTextField2.delegate = self
..
..
}
现在,只要用户按回车键,键盘就会关闭。
我也准备了一个例子sn-p,你可以从here查看。
【讨论】:
对于 Swift 3
你可以像这样隐藏键盘:
textField.resignFirstResponder()
如果要在用户按下“介绍”按钮时隐藏键盘,则必须实现以下UITextFieldDelegate 方法:
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
【讨论】:
这将放弃一个特定的文本字段
// Swift
TextField.resignFirstResponder()
// Objective C
[TextField resignFirstResponder];
要退出任何文本字段,请使用以下代码
// Swift
self.view!.endEditing(true)
// Objective C
[self.view endEditing:YES];
【讨论】:
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
// your code
[textField reloadInputViews];
}
【讨论】:
如果您有多个文本字段并且不知道哪个是第一响应者(或者您根本无法从编写此代码的任何位置访问文本字段),您可以在父视图上调用 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 要好得多,但由于某种原因,直到最近我才发现它。
【讨论】:
Never gonna tell a lie”的人,所以我们不会在最轻微的(因为没有谎言,这只是一个很好玩笑的答案)。
在某些情况下,没有文本字段是第一响应者,但键盘在屏幕上。 在这些情况下,上述方法无法关闭键盘。
如何到达那里的一个例子:
这种情况下你还需要让视图控制器退出编辑模式:
[viewController setEditing:NO animated:YES];
【讨论】:
在您的视图控制器 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];
}
【讨论】:
如果您不知道哪个 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)
【讨论】:
您只需将yourTextFieldName 替换为,您猜对了!你的文本字段。这将关闭键盘。
[yourTextFieldName resignFirstResponder];
【讨论】:
我建议你在你的头文件上添加和操作:
-(IBAction)removeKeyboard;
在实现中,这样写:
-(IBAction)removeKeyboard
{
[self.textfield resignFirstResponder];
}
在 NIB 文件中,从 UITextFiled 连接到选项 DidEndOnExit 上的文件所有者。这样,当你按下回车键时,键盘就会消失。
希望对你有帮助!
【讨论】: