我在表格的许多单元格中散落着相当多的控件,我想知道是否有一种更容易的方法可以不必循环遍历所有我的控件并将它们全部取消作为第一个响应者来关闭键盘。我猜问题是...我该如何获得当前第一响应者到键盘?
我在表格的许多单元格中散落着相当多的控件,我想知道是否有一种更容易的方法可以不必循环遍历所有我的控件并将它们全部取消作为第一个响应者来关闭键盘。我猜问题是...我该如何获得当前第一响应者到键盘?
尝试:
[self.view endEditing:YES];
[self.view endEditing:YES];
因为在Objective-C中,BOOL类型的取值只有YES/NO。 - chrisben你可以通过 [view endEditing:YES]
强制当前正在编辑的视图放弃第一响应者状态,从而隐藏键盘。
与 -[UIResponder resignFirstResponder]
不同,-[UIView endEditing:]
将搜索子视图以查找当前的第一响应者。因此,您可以将其发送到顶级视图(例如在 UIViewController
中的 self.view
),它将执行正确的操作。
(此答案先前包括其他几个解决方案,这些解决方案也起作用,但比必要的复杂。为避免混淆,我已将它们删除。)
[self.view endEditing:YES];
会更好。 - ftvs[UIView endediting:]
的工作原理。在我开发的一个应用程序中,一个搜索框被添加到了UINavigationViewController中,如果你只是调用[self.view endEditing:YES]
,作为你的视图控制器的self
,这将不起作用,相反,我直接在搜索框添加的视图范围内调用了这个方法,例如:[self.mySearchBoxView endEditing:YES]
。 - Jan Cássio[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
Swift 3.0:
UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
在 Mac OS X 上,零目标操作对于菜单命令是很常见的,而在 iOS 上,这里有一个用途。
说实话,我对这里提出的任何解决方案都不是很满意。但我找到了一种很好的使用TapGestureRecognizer的方法,我认为它能够解决您的问题:当您点击除键盘以外的任何东西时,关闭键盘。
在viewDidLoad中,注册接收键盘通知并创建一个UITapGestureRecognizer:
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(keyboardWillShow:) name:
UIKeyboardWillShowNotification object:nil];
[nc addObserver:self selector:@selector(keyboardWillHide:) name:
UIKeyboardWillHideNotification object:nil];
tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(didTapAnywhere:)];
添加显示/隐藏键盘的响应者。 在此处,您可以向应该在单击时解除键盘的UIView添加和删除TapGestureRecognizer。 注意:您不必将其添加到所有子视图或控件中。
-(void) keyboardWillShow:(NSNotification *) note {
[self.view addGestureRecognizer:tapRecognizer];
}
-(void) keyboardWillHide:(NSNotification *) note
{
[self.view removeGestureRecognizer:tapRecognizer];
}
当用户点击屏幕时,TapGestureRecognizer将调用您的函数,您可以通过以下方式取消键盘:
-(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {
[textField resignFirstResponder];
}
这个解决方案的好处在于它只过滤了“Tap”而不是“Swipe”。因此,如果您在键盘上方有滚动内容,则“swipes”仍然会滚动并保留键盘显示。在键盘消失后删除手势识别器后,视图上未来的轻触将被正常处理。这是一个解决方案,使键盘在按下任何文本字段中的return
时消失。只需在一个位置添加代码(因此不必为每个文本字段添加处理程序):
考虑以下场景:
我有一个带有两个文本字段(用户名和密码)的viewcontroller
。
并且viewcontroller
实现了UITextFieldDelegate
协议。
我在viewDidLoad
中进行如下操作:
- (void)viewDidLoad
{
[super viewDidLoad];
username.delegate = self;
password.delegate = self;
}
并且视图控制器实现了可选方法,代码如下:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
无论你在哪个文本字段中,一旦我按下键盘上的 return
,它就会被关闭!在你的情况下,只要将所有文本字段的委托设置为 self 并实现 textFieldShouldReturn
,同样的方法也会起作用。更好的方法是让某个东西“偷走”第一个响应者的状态。
由于UIApplication是UIResponder的子类,因此您可以尝试以下操作:
[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]
如果不行的话,创建一个大小为零的新UITextField,将其添加到某个视图中,然后执行类似的操作(先调用becomeFirstResponder再调用resignFirstResponder)。
将此代码放入某个实用类中。
+ (void)dismissKeyboard {
[self globalResignFirstResponder];
}
+ (void) globalResignFirstResponder {
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
for (UIView * view in [window subviews]){
[self globalResignFirstResponderRec:view];
}
}
+ (void) globalResignFirstResponderRec:(UIView*) view {
if ([view respondsToSelector:@selector(resignFirstResponder)]){
[view resignFirstResponder];
}
for (UIView * subview in [view subviews]){
[self globalResignFirstResponderRec:subview];
}
}
@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy:
真是太棒了!
非常感谢。
考虑到你们和其他人在这个帖子中提供的建议,我做了以下修改:
在使用时的效果:
[[self appDelegate] dismissKeyboard];
(注意:我添加了appDelegate作为NSObject的附加内容,这样我就可以在任何地方使用它)
在内部实现上是这样的:
- (void)dismissKeyboard
{
UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
tempTextField.enabled = NO;
[myRootViewController.view addSubview:tempTextField];
[tempTextField becomeFirstResponder];
[tempTextField resignFirstResponder];
[tempTextField removeFromSuperview];
}
编辑
我修改了我的答案,包括tempTextField.enabled = NO;
。禁用文本字段将防止UIKeyboardWillShowNotification
和UIKeyboardWillHideNotification
键盘通知在您的应用程序中发送,如果您依赖这些通知。
以下是我在代码中使用的内容,它非常有效!
在你的视图控制器.h文件中添加:
@property (nonatomic) UITapGestureRecognizer *tapRecognizer;
现在,在.m文件中的ViewDidLoad函数中添加以下内容:
- (void)viewDidLoad {
//Keyboard stuff
tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)];
tapRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapRecognizer];
}
- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
[self.view endEditing:YES];
}
touchesBegan:withEvent:
方法- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[textField resignFirstResponder];`
}
当您在背景
的任何地方触摸时,这将隐藏键盘
。
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
- Yerk