这是我以前处理过的方法。首先在您的视图控制器上创建一个方法,该方法将通过在您的文本字段上退出第一响应者状态来关闭键盘:
- (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. 前者在用户触摸控件外部结束编辑时调用,后者在用户按回车键结束编辑时调用。