SwiftUI 警报中的延迟操作

时间:2021-02-17 16:13:23

标签: swift swiftui alert dispatch

是否可以选择在按下警报按钮后进行延迟操作?

我试着写这样的代码:

 .alert(isPresented: $showingFeedback) {
                Alert(title: Text(scoreTitle), message:
                        Text(selectedQuestion!.feedback),
                        primaryButton:

                       .dispatchQueue.main.asyncAfter(deadline: .no () + 0.5) {
                       nextQuestion()},
                        
             
                      secondaryButton: .default(Text("Continue")) {
                        nextQuestion()}
                      
                )
            }

但是,当我尝试运行它时,在视图旁边出现以下错误:

<块引用>

'未能产生表达诊断;请提交错误报告'

1 个答案:

答案 0 :(得分:2)

您的代码的主要问题是没有像 Alert.Button 这样的 .dispatchQueue.main.asyncAfter(deadline: .no () + 0.5)

相反,您可以使用 .default 按钮并将 DispatchQueue.main.asyncAfter 部分作为 action(正如 Asperi 在评论中建议的那样):

.alert(isPresented: $showingFeedback) {
    Alert(
        title: Text(scoreTitle),
        message: Text(selectedQuestion!.feedback),
        primaryButton: .default(Text("Next")) {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                nextQuestion()
            }
        },
        secondaryButton: .default(Text("Continue")) {
            nextQuestion()
        }
    )
}

为了清楚起见,您还可以将操作提取到其他函数:

.alert(isPresented: $showingFeedback) {
    Alert(
        title: Text(scoreTitle),
        message: Text(selectedQuestion!.feedback),
        primaryButton: .default(Text("Next"), action: nextTapped),
        secondaryButton: .default(Text("Continue"), action: continueTapped)
    )
}
func nextTapped() {
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        nextQuestion()
    }
}

func continueTapped() {
    nextQuestion()
}

注意:最好避免强制展开:而不是:

selectedQuestion!.feedback

你可以这样做:

selectedQuestion?.feedback ?? "some default value"