我怎样才能忽略 iOS 键盘呢?

我有一个 UITextfield,我想解除键盘。无论我使用什么代码,我似乎都不能让键盘消失。

91749 次浏览
[myTextField resignFirstResponder]

这里 ,显示和隐藏键盘部分的第二段。

我建议您在头文件中添加和操作:

-(IBAction)removeKeyboard;

在实现中,写下如下代码:

-(IBAction)removeKeyboard
{
[self.textfield resignFirstResponder];
}

在 NIB 文件中,从 UITextFile 连接到 DidEndOnExit 选项上的文件所有者。这样,当你按返回键时,键盘就会消失。

希望能有帮助!

如果您有多个文本字段,并且不知道哪个是第一响应者(或者您根本无法从您正在编写代码的地方访问文本字段) ,您可以在包含文本字段的父视图上调用 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要好得多,但出于某种原因,我直到最近才发现它。

你只需要将 yourTextFieldName替换成,你猜对了! 你的文本字段。这会关闭键盘。

[yourTextFieldName resignFirstResponder];
-(void)methodName
{
[textFieldName resignFirstResponder];
}

使用 did EndOnExit 调用此方法(methodName)

如果你不知道哪个 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]);

在视图控制器 YourViewController.h 文件中,确保实现了 UITextFieldCommittee 协议:

@interface YourViewController : <UITextFieldDelegate>


@end

然后,在 YourViewController.m 文件中实现以下实例方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.yourTextField1 resignFirstResponder];
[self.yourTextField2 resignFirstResponder];
...
[self.yourTextFieldn resignFirstResponder];
}

有些情况下,没有文本字段是第一个响应者但键盘在屏幕上。 在这些情况下,上述方法无法忽略键盘。

如何到达那里的一个例子:

  1. 以编程方式将 ABPersonViewController 按到屏幕上; 打开任何联系人;
  2. 触摸“音符”字段(它成为第一个响应者并激活键盘) ;
  3. 向左滑动任何其他字段,使“删除”按钮出现;
  4. 到目前为止,在文本字段中还没有第一个响应者(只需通过编程检查) ,但是键盘仍然在那里。调用[ view endEditing: YES ]什么也不做。

在这种情况下,您还需要要求视图控制器退出编辑模式:

[viewController setEditing:NO animated:YES];

我发现了一个 endEditingresignFirstResponder失败的案例,这对我在这些案例中起了作用。

目的

[[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)

这将引用一个特定的文本字段

// 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];
}
  1. 在 Xcode 设置“ Did End On Exit”事件(右键单击文本字段)。

    Screenshot

  2. 实现这个方法:

    -(IBAction) closeKeyboard:(id) sender {
    [_txtField resignFirstResponder];
    }
    

对于 Swift 3

你可以这样隐藏键盘:

textField.resignFirstResponder()

如果你想隐藏键盘时,用户按“介绍”按钮,你必须实现以下 UITextFieldDelegate方法:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {


textField.resignFirstResponder()


return true
}

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
..
..
}

现在,只要用户点击返回键,键盘就会关闭。

我准备了一个例子片段太,你可以检查它从 给你

放弃应用程序中的任何文本字段

UIApplication.shared.keyWindow?.endEditing(true)

这种方法是干净的,并且保证能够工作,因为根据定义,keyWindow 是显示键盘(来源)的所有可能视图的根视图:

键窗口接收键盘和其他非触摸相关事件。一次只有一个窗口可能是键窗口。

作为最后的手段

let dummyTextView = UITextView(frame: .zero)
view.addSubview(dummyTextView)
dummyTextView.becomeFirstResponder()
dummyTextView.resignFirstResponder()
dummyTextView.removeFromSuperview()