当用户触摸我的UITextField外,我正试图摆脱键盘,使用这种方法:
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[mainTextController resignFirstResponder];
[super touchesBegan:touches withEvent:event];
}
然而,这似乎调用了一个按下键盘上的返回按钮后调用的方法,但我只是希望键盘消失,而不是按回车键。 我怎么能做到这一点?
谢谢!
编辑:tGilani的答案是最直接的方式,就像魅力一样,无需更改为UIControl。但我想jonkroll的答案也有效。答案 0 :(得分:13)
试
[self.view endEditing:YES];
更新
取一个布尔值并在init方法中将其设置为false。在textFieldShouldReturn
委托方法方法中,如果代码为false则执行代码,否则跳过
- (BOOL) textFieldShouldReturn:(UITextField*)textField
{
if (!boolean)
{
// YOur code logic here
}
boolean = false;
}
在你调用endEditing方法的方法中,将boolean设置为true。
boolean = YES;
[self.view endEditing:YES];
答案 1 :(得分:8)
以下是我以前处理过这个问题的方法。首先在视图控制器上创建一个方法,通过在文本字段中重新设置第一响应者状态来关闭键盘:
- (IBAction)dismissKeyboard:(id)sender
{
[mainTextController resignFirstResponder];
}
接下来,在ViewController
(或nib
,如果您没有使用故事板)的故事板场景中,将ViewController的view
属性的类从UIView
更改为UIControl
。 view
属性实际上是其他UI元素背后的背景。需要更改类类型,因为UIView
无法响应触摸事件,但UIControl
(UIView
的直接子类)可以响应它们。
最后,在ViewController的viewDidLoad:
方法中,告诉视图控制器在视图收到dismissKeyboard
事件时执行UIControlEventTouchDown
方法。
- (void)viewDidLoad
{
[super viewDidLoad];
UIControl *viewControl = (UIControl*)self.view;
[viewControl addTarget:self action:@selector(dismissKeyboard:) forControlEvents:UIControlEventTouchDown];
}
编辑:
您关注的部分原因似乎是当键盘被解除时调用textFieldDidEndEditing:
。这是不可避免的,只要文本字段失去焦点(即第一响应者状态),就会始终调用它。听起来您的问题是,当用户单击textFieldDidEndEditing:
中的返回按钮时,您已执行代码。如果您不希望在用户触摸文本字段之外时运行该代码,则不适合放置该代码。
相反,我会将该代码放在一个单独的方法中:
- (IBAction)textFieldReturn:(id)sender
{
if ([mainTextController isFirstResponder]) {
[mainTextController resignFirstResponder];
// put code to run after return key pressed here...
}
}
}
然后在文本字段发送控件事件UIControlEventEditingDidEndOnExit
时通过Target-Action调用该方法。
[mainTextController addTarget:self action:@selector(textFieldReturn:) forControlEvents:UIControlEventEditingDidEndOnExit];
请注意,UIControlEventEditingDidEndOnExit
与UIControlEventEditingDidEnd
不同。当用户触摸控件外部时编辑结束时调用前者,当用户按下返回键结束编辑时调用后者。
答案 2 :(得分:0)
您需要使用Identity Inspector将ViewController's
视图属性从UIView
更改为UIControl
:
从那里,你只需创建一个IBAction
并告诉文本字段被忽略(我假设你是mainTextController
)。如果mainTextController
不是您希望键盘关闭的文本字段,请将resignFirstReaponder
方法更改为您的文本字段。
- (IBAction)backgroundTap:(id)sender {
[myTextField resignFirstResponder];
}
然后从那里返回View Contoller的.xib
文件并将操作连接到Control View并选择“Touch Down”。