这是我以前处理过的方法。首先在您的视图控制器上创建一个方法,该方法将通过在您的文本字段上退出第一响应者状态来关闭键盘:
- (IBAction)dismissKeyboard:(id)sender
{
[mainTextController resignFirstResponder];
}
接下来,在您的故事板场景中ViewController
(或者nib
,如果您不使用故事板)将 ViewControllerview
属性的类从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...
}
}
}
然后在您的文本字段发送控制事件时通过 Target-Action 调用该方法UIControlEventEditingDidEndOnExit
。
[mainTextController addTarget:self action:@selector(textFieldReturn:) forControlEvents:UIControlEventEditingDidEndOnExit];
请注意,UIControlEventEditingDidEndOnExit
它不同于UIControlEventEditingDidEnd
. 前者在用户触摸控件外部结束编辑时调用,后者在用户按回车键结束编辑时调用。