在等待来自警报的用户输入时如何使用shouldSelectItemAt?

时间:2019-03-31 00:03:01

标签: ios swift

我想延迟从集合视图中选择项目,直到用户在弹出警报中回答了一个问题。

在这种情况下-当我有一个计时器在运行时,我希望弹出窗口询问他们是否真的要切换到新的计时器(在收集视图中选择了该计时器)并停止当前正在运行的计时器。

但是-返回发生在用户可以响应之前。任何帮助都会很棒。

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
    }

2 个答案:

答案 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 
 }