有一些答案,例如this,但如果有UIScrollView
或UICollectionView
,则不起作用。
<{1}}上的touchesBegan
方法永远不会被调用。
在屏幕上,我的顶部有一个viewController
在此之下,填满屏幕的其余部分为UITextField
如果我触摸UICollectionView
以外的任何地方我都需要关闭键盘(显然包括集合视图)
那么最好的方法是什么?
对于这种常见的UI范例,似乎应该有一个众所周知的解决方案,但我还没有碰到它。
答案 0 :(得分:4)
点击视图时关闭键盘:向ViewController.collectionView添加点击手势,如下所示:
//declare a property to store your current responder
@property (nonatomic, assign) id currentResponder;
//in viewDidLoad:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(resignOnTap:)];
[singleTap setNumberOfTapsRequired:1];
[singleTap setNumberOfTouchesRequired:1];
[self.collectionView addGestureRecognizer:singleTap];
//Implement the below delegate method:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
self.currentResponder = textField;
}
//Implement resignOnTap:
- (void)resignOnTap:(id)sender {
[self.currentResponder resignFirstResponder];
}
答案 1 :(得分:1)
这样做的简单方法是:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
答案 2 :(得分:1)
这是一个更好的解决方案,不需要单独为所有内容添加手势识别器。它在Swift中,但很容易转换为ObjC。
将以下内容添加到viewDidLoad():
let tap = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
然后添加以下方法声明:
func dismissKeyboard()
{
view.endEditing(true)
}
...其中view
是您的文字字段。