当视图包含UICollectionView时,在UITextField外的任何位置隐藏键盘

时间:2014-01-05 18:09:25

标签: ios uiviewcontroller uiscrollview uicollectionview first-responder

有一些答案,例如this,但如果有UIScrollViewUICollectionView,则不起作用。
<{1}}上的touchesBegan方法永远不会被调用。

在屏幕上,我的顶部有一个viewController 在此之下,填满屏幕的其余部分为UITextField 如果我触摸UICollectionView以外的任何地方我都需要关闭键盘(显然包括集合视图

那么最好的方法是什么?

对于这种常见的UI范例,似乎应该有一个众所周知的解决方案,但我还没有碰到它。

3 个答案:

答案 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是您的文字字段。