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"
是否可以选择在按下警报按钮后延迟操作?
我试过这样写代码:
.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"