SwiftUI 中警报的延迟操作

Delayed action in an alert in SwiftUI

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

我试过这样写代码:

 .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()}
                      
                )
            }

然而,当我尝试 运行 它时,我在视图旁边收到以下错误:

'Failed to produce diagnostic for expression; please file a bug report'

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

这样的 Alert.Button

相反,您可以使用 .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"