我想延迟从集合视图中选择项目,直到用户在弹出警报中回答了一个问题。
在这种情况下-当我有一个计时器在运行时,我希望弹出窗口询问他们是否真的要切换到新的计时器(在收集视图中选择了该计时器)并停止当前正在运行的计时器。
但是-返回发生在用户可以响应之前。任何帮助都会很棒。
func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool
{
var changeTimer: Bool = false
if isTimerRunning {
let alert = UIAlertController(title: "Switch Timers?", message: "Change timers now?", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "Yes", style: .default) { _ in
changeTimer = true
// more code
})
alert.addAction(UIAlertAction(title: "Cancel", style: .default) { _ in
changeTimer = false
})
self.present(alert, animated: true, completion: nil)
} else {
changeTimer = true
// more code
}
return changeTimer
}
答案 0 :(得分:1)
它不能等待shouldSelectItemAt
,但可以使用如下所示的辅助方法:
首先更新您的shouldSelectItemAt
方法,如下所示:
func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
if isTimerRunning {
showConfirmationPopUp(indexPath: indexPath)
return false
} else {
return true
}
}
然后添加showConfirmationPopUp
方法:
func showConfirmationPopUp(indexPath: IndexPath) {
let alert = UIAlertController(title: "Switch Timers?", message: "Change timers now?", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "Yes", style: .default) { _ in
// more code
self.myCollectionView.delegate?.collectionView!(self.myCollectionView, didSelectItemAt: indexPath)
})
alert.addAction(UIAlertAction(title: "Cancel", style: .default) { _ in
})
self.present(alert, animated: true, completion: nil)
}
现在,一旦用户单击Yes
选项,您的didSelectItemAt
就会呼叫。
但是您可以忽略
self.myCollectionView.delegate?.collectionView!(self.myCollectionView, didSelectItemAt: indexPath)
如果您不想调用didSelectItemAt
,并且可以像在Yes
中拥有indexPath
一样直接在showConfirmationPopUp
操作处理程序中对该选定单元格进行修改,方法。
答案 1 :(得分:0)
您可以将collectionView的选择完全设置为none并在其中
var currentSelected:Int?
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) -> Bool
// show alert and in success part reload the collectionView
let alert = UIAlertController(title: "Switch Timers?", message: "Change timers now?", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "Yes", style: .default) { _ in
self.currentSelected = indexPath.item
self.collectionView.reloadData()
})
alert.addAction(UIAlertAction(title: "Cancel", style: .default) { _ in
})
self.present(alert, animated: true, completion: nil)
}
然后在cellForItemAt
if indexPath.item == currentSelected {
// color it
else {
// not selected
}