ios:轻按collectionview单元格或tableview单元格时禁用第二触摸事件

时间:2019-04-22 22:03:28

标签: ios uitableview uicollectionview

我有一个带有CollectionView的ViewController,它可以加载ViewController中提出的问题的四个可能答案。 当用户选择一个项目时,将调用collectionView(_ collectionView:UICollectionView,didSelectItemAt indexPath:IndexPath),其中问题随答案数组一起更改(总是4),然后调用collectionView.reloadData重画新问题,并可能的答案。

一切正常,除了用户连续两次快速单击某项时。 在这种情况下,第一个选择会注册答案,然后collectionview会再次轻按(好像用户再次轻按了下一个问题),从而回答了另一个问题。

如果可能的话,我想做的是: 1.在第一次触摸时禁用触摸事件(在重新加载新问题时) 2.在collectionView的reloadData完成加载后,重新启用触摸事件。这是我使用从此线程How to tell when UITableView has completed ReloadData?

获取的自定义Collection View类解决的另一个问题

我尝试使用以下方法来禁用触摸事件:view.userInteractionEnabled = false / true和UIApplication.shared.beginIgnoringInteractionEvents()和UIApplication.shared.endIgnoringInteractionEvents()没有运气。

这是我到目前为止尝试过的:

b

我已经标记了Objective-C和Swift,因为我不介意解决方案所使用的语言,而且我也相信uitableview与uicollectionview的解决方案/问题类似。

有什么提示吗?

2 个答案:

答案 0 :(得分:0)

当您点击正确的答案单元格时,可以使用flag并将其设置为true,然后在reloadData()的onComplete块中将其设置为false。

例如:

var answerChosen: Bool = false

...

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    if answerChosen { return }

    let a = answers[indexPath.row]
    if a.descript.lowercased() == questionAnswer.descript.lowercased() //questionAnswer is the correct answer to the question {
        answerChosen = true
        self.loadNewQuestion()
        self.collectionView.reloadData(onComplete: {
            answerChosen = false    
        })
    } else {
        //warn about wrong answer
    }
}

答案 1 :(得分:0)

我终于设法解决了这个问题。解决该问题的技巧是将reloadData()放入调度异步块中。 这是最终代码。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    if UIApplication.shared.isIgnoringInteractionEvents {
        return //for extra safety
    }
    UIApplication.shared.beginIgnoringInteractionEvents()
    let a = answers[indexPath.row]
    if a.descript.lowercased() == questionAnswer.descript.lowercased() //questionAnswer is the correct answer to the question {
        self.loadNewQuestion()
        DispatchQueue.main.async(execute: {
            self.collectionView.reloadData(onComplete: {
                UIApplication.shared.endIgnoringInteractionEvents()
            })
        })
    } else {
        //warn about wrong answer
        DispatchQueue.main.async(execute: {
            self.collectionView.reloadData(onComplete: {
                UIApplication.shared.endIgnoringInteractionEvents()
            })
        })
    }
}