【问题标题】:collectionView's didSelectItemAt not called when use it with UITapGestureRecognizer与 UITapGestureRecognizer 一起使用时未调用 collectionView 的 didSelectItemAt
【发布时间】:2017-09-19 17:36:48
【问题描述】:

一旦我使用 addGestureRecognizer 关闭 scrollView 中的键盘,collectionView 的 didSelectItemAt 将不起作用。有什么建议吗?

更新代码:目前我可以点击关闭键盘并点击对收集单元格进行操作。但是,如果我滑动滚动视图,键盘将关闭。有什么办法可以防止吗?

class PostVC: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

    @IBOutlet weak var colorCollectionView: UICollectionView!
    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var titleTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tapViewGesture = UITapGestureRecognizer(target: self, action: #selector(PostVC.didTapViewForDismissKeyboard))
        scrollView.addGestureRecognizer(tapViewGesture)
        tapViewGesture.delegate = self
    }

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool{
        view.endEditing(true)
        return false
    }

    func didTapViewForDismissKeyboard(_ pressed: UIGestureRecognizer) {
        view.endEditing(true)
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("HIHI")
    }

extension PostVC: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}

【问题讨论】:

    标签: ios uiscrollview uicollectionview uitapgesturerecognizer uikeyboard


    【解决方案1】:

    尝试实现UIGestureRecognizerDelegate。在您的代码中实现其 gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:) 方法以返回 true - 这样您的手势识别器将工作,但它也将允许识别其他手势(特别是 collectionView 中的那个)。

    代码:

    // add this to initializing code to set gesture recognizer's delegate to self
    tapViewGesture.delegate = self
    

    委托实施:

    extension YourViewController: UIGestureRecognizerDelegate {
        func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
            return true
        }
    }
    

    【讨论】:

    • 嗨。结合你的答案和@duncan 的答案。我真的很亲近。请看我的更新
    • 即使您不使用邓肯的答案并且没有 shouldReceive 实现也会发生这种情况吗?
    • 如果我不使用邓肯的回答,collectionView 还是不行
    • 那我的建议有帮助吗?
    • collectionView和scrollView是什么关系?你知道collectionView 扩展了UIScrollView,因此实际上是一个scrollView 本身?
    【解决方案2】:

    不要使用手势识别器。那就是拦截您的水龙头而不是将它们提供给集合视图。而是在collectionView(_:didSelectItemAt:) 方法中调用view.endEditing(true)

    【讨论】:

    • 不会在collectionView(_:didSelectItemAt:) 方法中调用view.endEditing(true) 为您做这件事吗?
    • 无论如何要关闭键盘而不是将 view.endEditing(true) 放在 collectionView(_:didSelectItemAt:) 中?
    • 因为我的collectionview在我的视野中只占了一点空间
    • 我不确定手势识别器是否会在失败时将点击传递给视图。您可以尝试为您的手势识别器设置一个委托,实现 gestureRecognizer(_:shouldReceive:) 方法并返回 false(在调用 view.endEditing(true) 之后)。
    • 感谢您的帮助。我想我快到了。请看我的更新
    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多