我有一个带有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的解决方案/问题类似。
有什么提示吗?
答案 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()
})
})
}
}