UITextView专注,但用户触摸UICollectionViewCell。 隐藏键盘并运行didSelectItemAtIndexPath

我在查看顶部有一个“search”UITextField。 在这个下面,我有一个UICollectionView,它随着用户的input而填充search结果。

当用户input到UITextView中时,显示键盘。 起初,如果用户触摸UITextField外的任何地方,我想隐藏键盘。 我完成了以下几点:

func textFieldDidBeginEditing(textField: UITextField) { if (textField == self.textFieldSearch) { NSNotificationCenter.defaultCenter().addObserver(self, selector: "textFieldSearchDidChange:", name: UITextFieldTextDidChangeNotification, object: textField) } var tapGesture = UITapGestureRecognizer(target: self, action: "dismissKeyboard:") self.view.addGestureRecognizer(tapGesture) } func dismissKeyboard(gesture: UIGestureRecognizer) { self.textFieldSearch.resignFirstResponder() self.view.removeGestureRecognizer(gesture) } 

但是,如果用户点击UICollectionViewCell,dismissKeyboard func将运行,并隐藏键盘,但用户必须再次点击单元才能运行func:

 func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

我怎么一步到位呢? 因此,如果用户触摸UITextField之外的任何地方,隐藏键盘…但是如果用户碰巧碰到UICollectionViewCell,请在第一次触摸时运行didSelectItemAtIndexPath函数以及隐藏键盘并在UITextField上结束编辑?

任何帮助表示赞赏! 谢谢

请试试这个

 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { if touch.view == self.textFieldSearch{ return false; } else{ return true; } } 

并在你的代码中添加这一行

 var tapGesture = UITapGestureRecognizer(target: self, action: "dismissKeyboard:") tapGesture.delegate = self // add gesture delegate here self.view.addGestureRecognizer(tapGesture) 

你可以实现UIGestureRecognizerDelegate的委托方法

 optional func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool 

上面的方法返回NO的手势识别器不应该被调用的视图,在你的情况下,它应该是集合视图别的其他事情返回YES。

示例实现 –

 /** Disallow recognition of tap gestures on the collection view. */ func gestureRecognizer(recognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { if touch.view == collectionView && recognizer == tapRecognizer { return false } return true } 

这是一个解决scheme。 有一点点疯狂,但它应该做的伎俩。 你可能需要稍微修改一下。 另外我的Swift不是一stream的,所以没有任何语法错误。

 func dismissKeyboard(gesture: UIGestureRecognizer) { let point : CGPoint = gesture.locationInView(self.collectionView) let indexPath : NSIndexPath = self.collectionView.indexPathForItemAtPoint(point) self.textFieldSearch.resignFirstResponder() self.view.removeGestureRecognizer(gesture) self.collectionView.selectItemAtIndexPath(indexPath, animated:YES, scrollPosition:UICollectionViewScrollPosition.Top) } 

我在这里提供了一个Objective-C代码,用于在外部进行任何触摸时closureskeyBoard。 请自己写在Swift中。 问题是你正在添加一个点击手势隐藏你的collections单元格的触摸事件。

所以,而不是轻拍手势使用下面的代码的Swift翻译的代码。

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } 

不要使用你的水龙头手势。 而且我觉得事情应该会适合你

编辑

一些努力,以迅速为您写上述代码…

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent){ self.view.endEditing(true) } 

这是最终在上面@Sanjay的帮助下工作的代码。 我仍然想要隐藏键盘,如果用户触摸collectionView的一部分没有被单元格占用。 如果用户在UICollectionView上滑动/滚动/拖动,而不是点击,我仍然需要实现隐藏键盘的代码。

目前:

 func gestureRecognizer(recognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { for cell:AnyObject in self.collectionView.visibleCells() { if (touch.view.isDescendantOfView(cell as UIView)) { self.resignAllResponders() return false } } return true }