collectionView:didSelectItemAtIndexPath延迟调用

时间:2018-04-11 05:06:22

标签: ios swift uicollectionview swift4

我有一个集合视图,可以加载产品列表,但它没有任何奇特的功能。它只是从API加载数据。问题是,当我尝试点击集合视图中的一个项目时

collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)

没有被调用。但是,当我长按一个牢房时,它会被召唤。

我很确定没有在手机上应用手势。

任何人都可以给我一些指导来解决这个问题。

我拥有的代码库如下

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        let cellTapped     =   (self.storeSearchListingCollectionViewOutlet.cellForItem(at: indexPath)) as! StoreSearchProdListingCollectionViewCell

        UStoreShareClass.storeSharedInstance.longTappedProductID = String(cellTapped.tag)

        if((UStoreShareClass.storeSharedInstance.longTappedProductID) != nil)
        {
            self.performSegue(withIdentifier: "searchToProductDetailSegue", sender: self)
        }
        else
        {
            SetDefaultWrappers().showAlert(info:SERVER_DOWN_ERROR_ALERT, viewController: self)
        }
}

查看层次结构如下

enter image description here

提前致谢...... !!!

4 个答案:

答案 0 :(得分:1)

这是故意的。在故事板上转到集合视图并取消选中属性检查器中的“延迟触摸”

Screenshot

答案 1 :(得分:0)

可能有两个原因:

1)可能是第一个原因是:

不幸的是,您的代码没有让主线程在UI上运行。因此,您必须将与UI相关的部分放在MAIN线程中。

DispatchQueue.main.async {
// PUT YOUR CODE HERE
            if((UStoreShareClass.storeSharedInstance.longTappedProductID) != nil)
            {
                self.performSegue(withIdentifier: "searchToProductDetailSegue", sender: self)
            }
            else
            {
                SetDefaultWrappers().showAlert(info:SERVER_DOWN_ERROR_ALERT, viewController: self)
            }
    }

2)第二个原因:

你有没有关闭collectionView弹跳? 在故事板中,选中"弹出滚动"如果未选中,则collectionView的复选框。

check this one!

答案 2 :(得分:0)

对于这个老问题的未来读者-将来可能是我;)

我有一个UITapGestureRecognizer吞咽了我的小水龙头(在UICollectionView的祖父母中),因此只有旧的水龙头才能通过!我确认你有同样的问题。您只需要添加tapRecognizer.cancelsTouchesInView = false

let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapDidTouch(sender:)))
tapRecognizer.cancelsTouchesInView = false
scrollView.addGestureRecognizer(tapRecognizer)

答案 3 :(得分:-1)

首先,将断点置于if条件中并检查它是否进入didselect块。然后,

尝试添加" performsegue"主线程中的代码如下所示

if((UStoreShareClass.storeSharedInstance.longTappedProductID) != nil)
{

 DispatchQueue.main.async 
{ 
 self.performSegue(withIdentifier: "searchToProductDetailSegue", sender: self)

}
}
else
{
    SetDefaultWrappers().showAlert(info:SERVER_DOWN_ERROR_ALERT, viewController: self)
}