UICollectionView didSelectItem没有被调用

时间:2018-03-09 07:17:54

标签: ios swift uicollectionview

我感到困惑,因为这只是一件简单的事情,但是没有用。

这是我在这里写问题之前的核对清单。

  1. UICollectionViewDelegate已注册

  2. 上面没有任何内容比#34;调试视图层次结构中的UICollectionView"

  3. isUserInteractionEnabled的UICollectionView和UICollectionViewCell为true

  4. UICollectionView的
  5. isAllowsSelectiontrue

  6. 还有什么我应该看看吗?

    =====

    class MyView: NibDesignable { // It's UIView with NibDesignableProtocol (https://github.com/mbogh/NibDesignable)
        @IBOutlet weak var collectionView: UICollectionView!
    
        override init(frame: CGRect) {
            super.init(frame: frame)
    
            self.setup()
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
    
            self.setup()
        }
    
        private func setup() {
            print("test - It's called.")
    
            self.collectionView.dataSource = self
            self.collectionView.delegate = self
            self.collectionView.isUserInteractionEnabled = true
            self.collectionView.isAllowsSelection = true
        }
    }
    
    extension MyView: UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
        func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath {
            print("test - It's not called")
        }
    }
    

    我只粘贴了与问题相关的部分,因为所有代码都太长了。

8 个答案:

答案 0 :(得分:2)

isUserInteractionEnabled可能在MyView本身或其中任何一方的父母身上是假的

答案 1 :(得分:2)

如果您的自定义单元格中有一个actionRecognizer,则可能会发生这种情况。这将覆盖collectionView的didSelectItemAt委托。

如果这是您的问题,那么您可以通过识别gestureRecognizer并执行以下操作来解决此问题:

let tap = UITapGestureRecognizer(target: self, action: #selector(self.someViewInMyCellTapped(_:)))
someViewInMyCell.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false

答案 2 :(得分:1)

确保单元格是UICollectionViewCell的子类,而不是UICollectionViewReusableView的子类。

答案 3 :(得分:0)

尝试在

中设置委托
func awakeFromNib(){
 super.awakeFromNib()
 self.collectionView.dataSource = self
 self.collectionView.delegate = self } 

答案 4 :(得分:0)

如果有人在模拟器XR中遇到与我相同的问题 试用其他模拟器。 使用XR模拟器时,永远不会为某些索引调用我的didSelectItemAt方法,并且每次重新启动模拟器时,索引都是随机的。 使用iPhone 6s模拟器使它消失了

答案 5 :(得分:0)

我将Cell子视图的isUserInteractionEnabled属性更改为false。而且有效。

答案 6 :(得分:0)

对我来说,问题出在我的 BaseViewController

上的键盘扩展中
extension NewBaseVC: UITextFieldDelegate {

    func initializeHideKeyboard(){
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(
            target: self,
            action: #selector(dismissMyKeyboard))

        view.addGestureRecognizer(tap)
    }

    @objc func dismissMyKeyboard(){
        view.endEditing(true)
    }
}

当我打电话给initializeKeyboard()时,TapRecognizer被解雇了。并且拍子识别器与我的收藏夹视图didSelectItemEvent重叠。

答案 7 :(得分:0)

在情节提要中,CollectionView using System.Xml.Linq; namespace SVG { public class SvgElement : XElement { private static readonly XNamespace xmlns = "http://www.w3.org/2000/svg"; /// <inheritdoc /> public SvgElement(string name) : base(new XElement(xmlns + name)) { } /// <inheritdoc /> public SvgElement(string name, object content) : this(name) { this.Add(content); } } } 对我来说是取消选中的。选中 Selectable 后,Collectionview didSelectItemsAt 将调用。

  1. 转到您的故事板
  2. 选择您的 CollectionView
  3. 对勾 Selectable

enter image description here