Sev*_*oes 375 sdk cocoa-touch objective-c
我的桌子中有很多控制台分散在我的桌子中,我想知道是否有一种更简单的方法来解除键盘,而不必遍历所有控件并将它们全部作为第一响应者重新签名.我想这个问题是..我如何才能获得键盘当前的第一响应者?
小智 792
尝试:
__CODE__
Nic*_*ley 126
您可以强制当前编辑的视图重新调整其第一个响应者状态[view endEditing:YES].这隐藏了键盘.
不同的是-[UIResponder resignFirstResponder],-[UIView endEditing:]将搜索子视图以查找当前的第一响应者.所以你可以把它发送到你的顶级视图(例如self.view在a UIViewController),它会做正确的事情.
(这个答案以前包含了其他一些解决方案,这些解决方案也有效,但比必要的更复杂.我已将其删除以避免混淆.)
Tra*_*Man 91
您可以向应用程序发送零目标操作,它将随时辞职第一响应者,而无需担心哪个视图当前具有第一响应者状态.
Objective-C的:
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
Run Code Online (Sandbox Code Playgroud)
Swift 3.0:
UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
Run Code Online (Sandbox Code Playgroud)
NOS目标操作在Mac OS X上常用于菜单命令,这里是iOS上的用途.
小智 56
说实话,我并不为这里提出的任何解决方案而疯狂.我确实找到了一种使用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:)];
Run Code Online (Sandbox Code Playgroud)添加键盘显示/隐藏响应者.在那里你添加和删除TapGestureRecognizer到UIView,它应该在点击时解除键盘.注意:您不必将其添加到所有子视图或控件.
-(void) keyboardWillShow:(NSNotification *) note {
[self.view addGestureRecognizer:tapRecognizer];
}
-(void) keyboardWillHide:(NSNotification *) note
{
[self.view removeGestureRecognizer:tapRecognizer];
}
Run Code Online (Sandbox Code Playgroud)TapGestureRecognizer会在点击时调用您的函数,您可以像这样关闭键盘:
-(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {
[textField resignFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)这个解决方案的好处是它只过滤Taps,而不是滑动.因此,如果您在键盘上方滚动内容,则滑动仍会滚动并显示键盘.通过在键盘消失后移除手势识别器,可以正常处理视图上的未来点击.
pra*_*ash 22
这是一个解决方案,通过在一个地方添加代码使键盘return在任何文本字段中被击中时消失(因此不必为每个文本字段添加处理程序):
考虑这种情况:
我有viewcontroller两个文本字段(用户名和密码).和viewcontroller实现UITextFieldDelegate协议
我在viewDidLoad中这样做
- (void)viewDidLoad
{
[super viewDidLoad];
username.delegate = self;
password.delegate = self;
}
Run Code Online (Sandbox Code Playgroud)
并且viewcontroller将可选方法实现为
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
无论你在哪个文本区域,只要我按下return键盘,它就会被解雇!
在你的情况下,只要你将所有textfield的委托设置为self并实现,它就会起作用 textFieldShouldReturn
Ken*_*ner 14
更好的方法是让某些东西"窃取"第一响应者状态.
由于UIApplication是UIResponder的子类,您可以尝试:
[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]
Run Code Online (Sandbox Code Playgroud)
如果做不到这一点,创建一个具有零大小框架的新UITextField,将其添加到某个地方的视图并执行类似的操作(之后再进行重新签名).
把它放在一些实用类中.
+ (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];
}
}
Run Code Online (Sandbox Code Playgroud)
@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];
}
Run Code Online (Sandbox Code Playgroud)
编辑
修改我的答案包括在内tempTextField.enabled = NO;.禁用文本字段将防止UIKeyboardWillShowNotification和UIKeyboardWillHideNotification被发送键盘的通知你应该依靠这些通知在您的应用程序.
小智 5
这里有很多过于复杂的答案,也许是因为这在iOS文档中并不容易找到.约瑟夫H就在上面:
[[view window] endEditing:YES];
Run Code Online (Sandbox Code Playgroud)
小智 5
比 Meagar 的答案还要简单
覆盖touchesBegan:withEvent:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[textField resignFirstResponder];`
}
Run Code Online (Sandbox Code Playgroud)
dismiss the keyboard当您触摸 中的任何位置时都会出现此情况background。
这是我在代码中使用的内容。它就像一个魅力!
在 yourviewcontroller.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];
}
Run Code Online (Sandbox Code Playgroud)
此外,在 .m 文件中添加此函数:
- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
[self.view endEditing:YES];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
202632 次 |
| 最近记录: |