是否可以选择在按下警报按钮后进行延迟操作?
我试着写这样的代码:
.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()}
)
}
但是,当我尝试运行它时,在视图旁边出现以下错误:
<块引用>'未能产生表达诊断;请提交错误报告'
答案 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"